使用函数和 with / end with 访问类对象



我创建了一个类对象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

End With之后是否存在classBlock实例?

如果我多次调用funcBlock,我是否用classBlock实例弄乱了内存?

谢谢!

也许你误解了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)

。然后,varaible block仅引用最后一个实例,并且可以访问该实例。前两个实例只是使内存:)混乱。呵呵

感谢您的回复。根据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销毁它。据推测,当类实例被销毁时,classBlock创建的数组也会被删除。

相关内容

  • 没有找到相关文章

最新更新