我正在学习vba,现在我正在尝试开始使用类,因为我发现否则我的程序很难使用,而且我总是一遍又一遍地编写类似的代码。
你能推荐任何涵盖vba中用户定义对象的书吗?因为我发现的所有内容都只是对该主题的简短介绍。
当我在寻找这样一本书时,我在vb.net上找到了很多高级书籍。据我了解,这种语言更“强大”(可用于更广泛的任务)。
当您想了解 VBA 时,请在VB6上查找参考资料。您可能可以以便宜的价格找到很多参考资料和书籍。我认为自己非常擅长 VBA,这就是我学到很多东西的方式。即使是最新版本的 VBA (VBA7) 本质上也是 VB6 的子集。您可以了解的有关 VB6 的大部分内容都完全适用于 VBA,尤其是关于类和 UDT(这有点像structs
.NET 世界中的)。
根据我自己的经验,我会说用户定义的类型(使用Type
关键字声明)很少有用,除非在单个模块中私有使用,用于需要指向某个结构的指针的本机函数声明。它们的根本缺点是它们不能被强制转换为Variant
,这是高级 VBA 的杀手锏。一旦你习惯了它,用相同的字段快速构建一个类(com VB 术语中的一个类模块)并不难。
后期脚本:这在学习类或用户定义类型时对您没有帮助,所以我仅将其添加为后期脚本:您还可以通过搜索VBScript找到很多有用的信息。大多数 VBScript 可以直接粘贴到 VBA 项目中,它会运行,除了无法访问 Wscript
对象等小例外。许多文档示例,例如MSXML(用于与 XML 文件和 Internet 交互)显示 VBScript,并且所有这些代码都可以在 VBA 中轻松使用。
The VBA Developer's Handbook by Getz and Gilbert gets my vote. It's old and out of print, but you can get an electronic copy here https://play.google.com/store/books/details/Ken_Getz_Vba_Developer_s_Handbook?id=46toCUvklIQC&feature=null-Mike+Gilbert
It's a bit of a beast, but a great book
VB.NET 是一种完整的编程语言——它不需要“在”Excel 中运行。有几种方法可以“连接”VB.net 和 Excel,例如“Com Interop”或将代码集成到工作簿中(我在这里含糊不清,因为我自己从未做过后者)。易用性难以访问 - 如果您只想处理内部 Excel 数据,VBA 更适合,因为它更快。如果您想从 Internet 读取数据、存储/加载数据或构建您自己的 UI,vb.net 会更快,因为 VBA 可以完成所有这些事情,但这就像用螺丝刀将钉子钉在墙上一样。
您是什么意思“我的程序太难使用”?
编写类并不一定会让你的工具更容易使用......
我也没有真正看到一遍又一遍地使用相同的代码有问题,只要你尊重良好实践的一般规则(高性能、动态、透明, ETC...)。
上课有什么要知道的?
类使创建标准封装对象成为可能,其中包含只能通过类函数(get和let)访问的私有属性。
您可以将一个类模块实例化为一个对象实例并创建同一个类的多个实例(使用New关键字)。
你不能用标准模块做到这一点;即使您可以为标准模块(VBA 开发人员主要使用)声明私有属性,也只会存在此变量的一个“副本”。
示例比较:
标准模块:
“m_Standard_Module”*
Option Explicit
Private lNumber_Test As Long
Property Get get_Number_Test() As Long
get_Number_Test = lNumber_Test
End Property
Property Let letNumber_Test(param_Number_Test As Long)
lNumber_Test = param_Number_Test
End Property
调用自:
Sub test_Standard_Module()
Dim iNumber As Integer
'--> This will produce an error, cannot be instantiated!
'Dim mdlStandard as m_Standard_Module
'Property contained by standard module is unique and cannot be copied.
m_Standard_Module.letNumber_Test = 2
iNumber = m_Standard_Module.get_Number_Test
MsgBox iNumber
End Sub
类模块:
名为“c_Class_Module”的类
Option Explicit
Private pNumber_Class As Long
Public Property Get number_Class() As Long
number_Class = pNumber_Class
End Property
Public Property Let number_Class(param_Number_Test As Long)
pNumber_Class = param_Number_Test
End Property
调用自:
Sub test_Class()
Dim clsClass_Module1 As c_Class_Module
Dim clsClass_Module2 As c_Class_Module
Dim lNumber1 As Long
Dim lNumber2 As Long
'Can instantiate multiple objects!
Set clsClass_Module1 = New c_Class_Module
Set clsClass_Module2 = New c_Class_Module
'property number_Class is copied for each of the class instances
clsClass_Module1.number_Class = 1
clsClass_Module2.number_Class = 2
iNumber1 = clsClass_Module1.number_Class
iNumber2 = clsClass_Module2.number_Class
MsgBox iNumber1 & ", " & iNumber2
Set clsClass_Module1 = Nothing
Set clsClass_Module2 = Nothing
End Sub
所以基本上,类对象仅在您想要创建相同类型对象的多个实例(具有相似属性)的情况下才有用。
每当您制作工具时,首先创建一个对象模型是很有用的,您可以在其中确定所需的对象及其要创建的属性。
请注意,VBA 不支持继承,这意味着一个类不能从另一个类“继承”属性(其中基本示例是 Employee 类将从 Person 类继承)。不过,它从来没有真正困扰过我。