PublicSub ClassMembers() Dim oSimple AsNew CExample oSimple.PrintText "Hello" Dim total AsDouble total = oSimple.Calculate(22.44) Debug.Print total EndSub
Class Module Member Variables
类变量和 VBA 中普通的变量非常相似,唯一的区别是在定义是用 Private 或 Public 而不是 Dim.
1 2 3
'Class Module: CBankAccount Private fBalance AsDouble Public sName AsString
Sub GetNumCountries() Dim clsCountry As CCountry NumCountries = UBound(clsCountry.arrCountries) - LBound(clsCountry.arrCountries) Debug.Print NumCountries EndSub
那么问题来了,挖掘机技术哪家… :
为了得到国家的数量你需要先知道这个 list 是以什么方式存储的(这个 case 里是 array)
Sub TestLetSet() Dim Prices AsNew Collection Prices.Add 21.23 Prices.Add 22.12 Prices.Add 20.12 Dim clsCurrency AsNew CCurrency Set clsCurrency.Prices = Prices Dim PricesCopy As Collection Set PricesCopy = clsCurrency.Prices PrintCollection Prices, "Prices" PrintCollection PricesCopy, "Copy" EndSub
Sub PrintCollection(c As Collection, name AsString)
Debug.Print vbNewLine & "Printing " & name & ":"
Dim item As Variant ForEach item In c Debug.Print item Next item
EndSub
有一个需要注意的点事当我们用 Set 时我们其实在引用同一个 collection. Set 并没有创造 collection 的副本。
Class Module Events
Class Module 有两个 Events:
Initialize – 当类有新的对象创建时触发
Terminate – 当类的对象被删除时触发
Events 有点像 C++ 中的构造函数和析构函数。在大多数语言中,我们可以传递参数给构造函数但是在 VBA 中并不能。
Initialize
1 2 3 4 5 6 7 8 9 10 11 12
'Class Module: CSimple PrivateSub Class_Initialize() MsgBox "Class is being initialized" EndSub
PrivateSub Class_Terminate() MsgBox "Class is being terminated" EndSub
PublicSub PrintHello() Debug.Print "Hello" EndSub
在下面的 case 里, clsSimple 在我们第一次引用时才会被创建出来:
1 2 3 4 5 6
Sub ClassEventsInit() Dim clsSimple AsNew CSimple
' Initialize occurs here clsSimple.PrintHello EndSub
用 Set 还是 New 来创建新对象是还是有区别的。在下面的 case 里用 Set 来创建新对象:
1 2 3 4 5 6 7 8
Sub ClassEventsInit2()
Dim clsSimple As CSimple ' Initialize occurs here Set clsSimple = New CSimple clsSimple.PrintHello EndSub