我创建了一个类对象classBlock
,它使用一个数组来加快对Excel工作表的读/写速度。我还创建了一个易于使用的功能:
Function funcBlock(objSheet as WorkSheet) as classBlock
Set funcBlock = New classBlock
funcBlock.Initialize objSheet
End Function
如果我使用With
构造调用该函数,如下所示......
With funcBlock(ActiveSheet)
.SomeFunctions
End With
... classBlock
之后是否存在End With
的实例?
如果我多次拨打funcBlock
,我是否会使classBlock
的实例混乱记忆?
谢谢!
答案 0 :(得分:1)
也许你错过了With-End With
的概念?
With语句允许您对指定对象执行一系列语句,而无需重新限定对象的名称。
所以你得到了类的实例,然后With
可以用来编写语句,而不必重复对象名称:
Dim block as classBlock
Set block = funcBlock(ActiveSheet)
With block
.SomeFunctions
' .SomeProperty = 100
' .Save(true)
' etc.
End With
With
只会让您免于输入以下内容。
block.SomeFunctions
block.SomeProperty = 100
block.Save(true)
该类的实例现在由变量block
引用,并且根据声明的范围存在。
如果多次调用函数funcBlock
,每次调用函数时都会创建新对象。
所以我们调用函数,例如三次:
Dim block1 as classBlock
Set block1 = funcBlock(ActiveSheet)
Dim block2 as classBlock
Set block2 = funcBlock(ActiveSheet)
Dim block3 as classBlock
Set block3 = funcBlock(ActiveSheet)
现在你在内存中有三个对象,它们用变量block1, block2, block3
引用。
使用此变量可以访问对象。
但是当你像这样召唤函数funcBlock
三次时:
Dim block as classBlock
Set block = funcBlock(ActiveSheet)
' some code ...
Set block = funcBlock(ActiveSheet)
' some code ...
Set block = funcBlock(ActiveSheet)
...然后只有最后一个实例被变量block
引用并且可以被访问。
前两个实例只是弄乱了内存:)。 HTH
答案 1 :(得分:1)
感谢您的回复。根据 jkpieterse 的建议,我将以下内容添加到classBlock
:
Private Sub Class_Initialize()
MsgBox "HELLO"
End Sub
Private Sub Class_Terminate()
MsgBox "GOODBYE"
End Sub
然后我运行了以下内容:
Sub Test
With funcBlock(ActiveSheet)
End With
MsgBox "AFTER"
End Sub
结果消息序列为:HELLO
,GOODBYE
,AFTER
。这意味着Excel认识到实例是在With
创建的,因此会在End With
处销毁它。据推测,当{1}}创建的数组在类实例被销毁时也会被删除。