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管理得很好。