Vba 使用函数和With/End With访问类对象

Vba 使用函数和With/End With访问类对象,vba,excel,Vba,Excel,我创建了一个类对象classBlock,它使用数组加速对Excel工作表的读/写。我还创建了一个易于使用的函数: Function funcBlock(objSheet as WorkSheet) as classBlock Set funcBlock = New classBlock funcBlock.Initialize objSheet End Function 如果我使用和构造调用函数,如下所示 With funcBlock(ActiveSheet) .Som

我创建了一个类对象
classBlock
,它使用数组加速对Excel工作表的读/写。我还创建了一个易于使用的函数:

Function funcBlock(objSheet as WorkSheet) as classBlock
    Set funcBlock = New classBlock
    funcBlock.Initialize objSheet
End Function
如果我使用
构造调用函数,如下所示

With funcBlock(ActiveSheet)
    .SomeFunctions
End With
。。。在
结尾之后是否存在
类块
的实例

如果我多次调用
funcBlock
,是否会使
classBlock
实例的内存混乱


谢谢

也许您误解了带结尾的
的概念?
该语句允许您对指定对象执行一系列语句,而无需重新确定对象的名称

因此,您可以获得该类的实例,然后使用
编写语句,而无需重复对象名称:

Dim block as classBlock
Set block = funcBlock(ActiveSheet)

With block
    .SomeFunctions
    ' .SomeProperty = 100
    ' .Save(true)
    ' etc.
End 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
块引用,并且可以访问。

前两个实例只会使内存混乱:)。谢谢你的回复。根据jkpieterse的建议,我在
类块中添加了以下内容:

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

生成的消息序列是:
你好
再见
之后。这对我来说意味着Excel正在识别该实例是使用
处创建的,因此在
结束时使用
将其销毁。当类实例被销毁时,
classBlock
创建的数组可能也会被删除。

我会说“否”和“是”。后者可能依赖于类析构函数。但是,如果在一大块单元格上使用变体数组来辅助处理,则不会一直将单元格值重新读取到数组中;不,您将批量加载这些值一次,处理它们,然后将它们批量转储回工作表。我不明白你为什么要反复给你的班级打电话,因为。。。不管是否结束,谢谢。在我正在进行的项目中,我可能会在不同的范围和不同的工作表上调用它三到四次。我可能会重新构造代码,以便每个工作表只调用一次,但在这个阶段,我只是想了解在上述场景中类实例会发生什么。向类添加一个终止事件,以便您可以看到它确切地在何时被销毁。但是,当您启动一个新的With块时,您的类将被重新实例化,因为每次调用该函数时,该函数都会实例化该类的一个新副本。这很有趣,可能我误解了您的问题:)。没问题。和您一样,我也担心内存会被冗余的类实例弄得乱七八糟,但看起来Excel管理得很好。