关于vba中的变量有一个问题:
1.变量是否具有巨大的字符串或大量的数据(如数组)或对象会占用大量的内存?
1.如果过程完全执行,它们(所有局部变量和对象)是否也完全从内存中释放出来?
另一个示例,我有一些代码:
Sub Routine()
'Step 1
Call CreateSheet
Call CopySomeRange
End Sub
Sub CreateSheet()
Dim ws As Worksheet
Set ws = Thisworkbook.Add
With ws
.Name = "Sample"
'... some activity here...
End With
End Sub
Sub CopySomeRange()
Dim ws As Worksheet
Set ws = Thisworkbook.Worksheet("Sample")
With ws
.Range("A1:A100").Copy .Range("B1:B100") '>>> Sometimes error
End With
End Sub
有时我在复制范围内的操作会出错。当我检查代码时,它说ws
是空的(没有设置为“样本”工作表)。
程序CreateSheet
和CopySomeRange
都用作ws
对象。有什么联系吗?
2条答案
按热度按时间nimxete21#
a)
ws
是两个例程中的局部变量。他们是完全独立的。**B)**局部变量在例程代码完成时被销毁(静态变量除外)。在
ws
的情况下,这只是指向工作表的 * 引用 ,而不是工作表本身。**c)**使用
new
关键字创建的对象在没有更多引用时被销毁。因此,如果你在例程中创建一个对象,并将其赋给一个局部变量,然后将对象引用复制到一个在子例程结束后仍然存在的变量中,例如,作为函数的结果,复制到一个作为参数传递的变量中,对象不会被销毁。VBA垃圾收集是如此好,你几乎找不到任何关于它的信息,它只是工作。**d)**在您的代码中,您希望创建新的Excel工作表。此工作表由Excel而不是VBA处理,VBA无法销毁它(它只能调用delete-method要求Excel删除并销毁它)。
**e)**Objects and Array使用的内存量或多或少都是您所期望的。一个10001000 Doubles的数组需要8 mb(100万乘以8字节)的数据,加上非常小的开销。字符串稍微复杂一点,但是根据经验,现在你不必担心内存消耗。
有关内存的更多信息,请查看https://nolongerset.com/memory-management-in-vba/
看看你的代码,有(至少)两个问题。这两种方法都已经引发了编译时错误,因此您的代码根本不会被执行。
在SubCreateSheet中,创建新工作表的行为
在Sub CopySomeRange中,将工作表引用分配给变量的行为
假设这些错误被纠正了,我看不出有什么原因会导致
ws
变成Nothing
。vsdwdz232#
问题1.变量是否带有巨大的字符串或大量的数据(如数组)或对象会占用大量的内存?
答:是的,但这不应该是现代计算机的问题
如果过程完全执行,它们(所有的局部变量和对象)是否也完全从内存中释放出来?
无论过程是否完全执行,变量都会在某个阶段超出范围-此参考更好地解释了Understanding scope and visibility - Microsoft Learn
问:CreateSheet和CopySomeRange过程都用作对象。有什么联系吗?
不-没有联系。见上面的链接。
“有时候我在复制范围内的操作会出错。“
我看不出这是怎么可能的,因为你的代码根本不会运行。请参阅@VBasic2008的评论。它有多个语法错误