Tra*_*ace 23 excel vba excel-vba
最近我碰到了一个让我更健康的问题; 它让我忙碌,我无法在网上找到透明的解释.
它与Excel对象的破坏有关(我一直使用它,以前从未真正质疑过).
导致我的问题的背景:
使用常规对象,您可以使用关键字SET和NEW来实例化对象.例如:
Set classInstance = New className
Run Code Online (Sandbox Code Playgroud)
每当我们以这种方式实例化时,对象就会在堆内存中创建,并且引用计数器会增加1.
如果我不添加更多引用,则以下语句会将引用计数返回到零:
Set classInstance = Nothing
Run Code Online (Sandbox Code Playgroud)
当引用计数变为0时,对象将被销毁并从内存中清除,并且"classInstance"指向.
我读过的内容:
当我们使用"CREATEOBJECT"函数时,它返回对COM对象的引用.
Set oApp = CreateObject("Excel.Application")
Run Code Online (Sandbox Code Playgroud)
即使我们可以说:
Set oApp = nothing
Run Code Online (Sandbox Code Playgroud)
对象的引用计数将变为0,oApp将不再指向该对象.
我的问题:
1)为什么这种类型的对象需要在实际从内存中删除对象之前调用方法.Quit?
添加对需要.close方法的工作簿对象(workbooks.add或workbook.open)的引用时也是如此.为什么在将引用计数设置为零时不能自动销毁这些对象?
当我们说例如:
set oRange = nothing
Run Code Online (Sandbox Code Playgroud)
2)有必要说:
oApp.Quit
set oApp = nothing
Run Code Online (Sandbox Code Playgroud)
由于在应用.Quit时已经从内存中清除了Application对象,因此不再有对象被释放.
我想出的唯一原因是,为什么oApp在Quit之后会被设置为Nothing,因为它可能指向一个未使用的内存位置(在堆上),如果重新分配这个内存,可能会导致混乱(虽然在VBA中我发现这很难想象).我问自己这个结论是否正确,我想从知道答案的人那里得到确认.
请告诉我,如果我看错了.
3)他们在VBA中称之为"对象的引用"(例如上面代码中的oApp),我将它们视为C中的指针变量.使用此语句是否安全或再次使用,我是否错误地看到了这一点?
一般来说并不难应用.确定并设置为空,但收到关于该主题的一些准确信息会很好.所以我知道为什么我这样做的百分之百.
Sid*_*out 12
好问题 :)
Excel控制其对象的创建.同样,它也控制着它们的破坏.
设置oApp = Nothing
只会破坏对象引用.它不会删除应用程序.要销毁Excel对象,必须使用它的.Quit
方法.
无论何时执行,都会删除Set x = Nothing
命名x
为其相关对象的引用(指针).这并不意味着对象本身将从内存中删除.对象是否将从内存中删除,取决于各种因素.
该.Quit
方法被定义为优雅地删除excel已分配的所有内存对象,并自行关闭.
它类似于Close
在VB6中调用表单.例如,vb6中的表单.
Dim f As Form
Set f = Form1
f.Show
'
'~~> Rest of the code
'
Set f = Nothing
Run Code Online (Sandbox Code Playgroud)
这会破坏形式吗?:)
跟进
问题2怎么样?谢谢 - 金吉森14分钟前
它可能不完全如此处所示,并且编译器优化可能使事情表现不同......但这是工作中的基本概念.