使用Function和With / End With访问类对象

时间:2016-02-14 05:42:57

标签: excel vba excel-vba

我创建了一个类对象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的实例混乱记忆?

谢谢!

2 个答案:

答案 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

结果消息序列为:HELLOGOODBYEAFTER。这意味着Excel认识到实例是在With创建的,因此会在End With处销毁它。据推测,当{1}}创建的数组在类实例被销毁时也会被删除。