我正在学习vba,现在我正在尝试开始使用课程,因为我发现我的程序太难以使用,而且我总是一遍又一遍地编写类似的代码。
你能推荐一本涵盖vba中用户定义对象的书吗?因为我发现的所有内容都只是简单介绍了这个主题。
在我搜索这样一本书时,我在vb.net找到了许多高级书籍。据我所知,这种语言更“强大”(可用于更广泛的任务)。
答案 0 :(得分:2)
如果您想了解VBA,请在 VB6 上查找参考资料。您可以找到便宜的很多参考书和书籍。我认为自己非常擅长VBA,这就是我学到很多东西的原因。即使是最新版本的VBA(VBA7)也是VB6的一个子集。关于VB6的大部分内容完全适用于VBA,特别是关于类和UDT(在.NET世界中有点像structs
)。
根据我自己的经验,我会说用户定义的类型(使用Type
关键字声明)很少有用除了私有用在单个模块中以达到本机目的函数声明,需要指向某个结构的指针。它们的根本缺点是它们无法与Variant
进行强制转换,后者是高级VBA的杀手。一旦你习惯了它,用同样的字段快速构建一个类(用VB语言中的类模块)并不太难。
发布脚本:在学习类或用户定义的类型时,这对你没有帮助,所以我只是将其添加为后期脚本:你也可以通过搜索的VBScript 即可。大多数VBScript可以直接粘贴到VBA项目中,它会运行,但有一些小例外,例如无法访问Wscript
对象。许多文档示例(如MSXML(用于与XML文件和Internet交互)都显示VBScript,所有这些代码都可以在VBA中使用。
答案 1 :(得分:1)
Getz和Gilbert的VBA开发者手册获得了我的投票。它已经过时了,但你可以在这里获得电子版https://play.google.com/store/books/details/Ken_Getz_Vba_Developer_s_Handbook?id=46toCUvklIQC&feature=null-Mike+Gilbert
这是一个野兽,但是一本好书
答案 2 :(得分:0)
VB.NET是一种完整的编程语言 - 不需要在“Excel”中运行。 有几种方法可以“连接”VB.net和Excel,例如“Com Interop”或将代码集成到工作簿中(我在这里含糊不清,因为我自己从未做过后者)。 易用性很难获得 - 如果您只想使用内部Excel数据,VBA更适合,因为它更快。如果你想从互联网上读取数据,存储/加载数据或构建你自己的UI vb.net会更快,因为VBA可以做所有这些事情,但就像用螺丝刀敲钉子一样钉在墙上。
答案 3 :(得分:0)
你的意思是“我的节目难以使用”?
编写课程不一定能使您的工具更容易使用...
我也没有看到一遍又一遍地使用相同代码的问题,只要你尊重良好实践的一般规则(高性能,动态,透明等等)。
有什么关于课程的知识?
类可以创建标准的封装的对象,其中包含只能通过类函数访问的私有属性( get 和 let )。
您可以将类模块实例化到对象实例中,并创建同一类的多个实例(使用新关键字)。
你不能用标准模块做到这一点;即使您可以为标准模块(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类继承)。它从来没有真正打扰过我。