excel VBA变量、对象和内存

46qrfjad  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(232)

关于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是空的(没有设置为“样本”工作表)。
程序CreateSheetCopySomeRange都用作ws对象。有什么联系吗?

nimxete2

nimxete21#

a)ws是两个例程中的局部变量。他们是完全独立的。
**B)**局部变量在例程代码完成时被销毁(静态变量除外)。在ws的情况下,这只是指向工作表的 * 引用 ,而不是工作表本身。
**c)**使用new关键字创建的对象在没有更多引用时被销毁。因此,如果你在例程中创建一个对象,并将其赋给一个局部变量,然后将对象引用复制到一个在子例程结束后仍然存在的变量中,例如,作为函数的结果,复制到一个作为参数传递的变量中,对象不会被销毁。VBA垃圾收集是如此好,你几乎找不到任何关于它的信息,它只是工作。
**d)**在您的代码中,您希望创建新的Excel工作表。此工作表由Excel而不是VBA处理,VBA无法销毁它(它只能调用delete-method要求Excel删除并销毁它)。
**e)**Objects and Array使用的内存量或多或少都是您所期望的。一个1000
1000 Doubles的数组需要8 mb(100万乘以8字节)的数据,加上非常小的开销。字符串稍微复杂一点,但是根据经验,现在你不必担心内存消耗。

有关内存的更多信息,请查看https://nolongerset.com/memory-management-in-vba/
看看你的代码,有(至少)两个问题。这两种方法都已经引发了编译时错误,因此您的代码根本不会被执行。
在SubCreateSheet中,创建新工作表的行为

Set ws = ThisWorkbook.Worksheets.Add

在Sub CopySomeRange中,将工作表引用分配给变量的行为

Set ws = ThisWorkbook.Worksheets("Sample")

假设这些错误被纠正了,我看不出有什么原因会导致ws变成Nothing

vsdwdz23

vsdwdz232#

问题1.变量是否带有巨大的字符串或大量的数据(如数组)或对象会占用大量的内存?
答:是的,但这不应该是现代计算机的问题
如果过程完全执行,它们(所有的局部变量和对象)是否也完全从内存中释放出来?
无论过程是否完全执行,变量都会在某个阶段超出范围-此参考更好地解释了Understanding scope and visibility - Microsoft Learn
问:CreateSheet和CopySomeRange过程都用作对象。有什么联系吗?
不-没有联系。见上面的链接。
“有时候我在复制范围内的操作会出错。“
我看不出这是怎么可能的,因为你的代码根本不会运行。请参阅@VBasic2008的评论。它有多个语法错误

相关问题