我有一个循环将用户窗体控件添加到集合中。
由于多个地方都需要该集合,因此我将其放入模块中并在需要时调用它。
这意味着该集合仅在需要时才位于内存中,但这也意味着我每次想要使用它时都会运行一个循环。
I could已给出集合模块级别范围并在第一次需要时创建它。
我会运行一次循环,但集合会保留在内存中。
我发现 32 位 Excel 的内存限制为 1.75Gb(尽管可以扩展,并且有 64 位版本),并且 VBA excel 是单线程的。
看来我应该优先考虑处理器效率而不是内存效率,除非我有特殊需要。应用程序不仅会更快,而且可能会更加节能。
赋予集合模块级别范围可能会导致无意的更改。
有没有办法创建一次集合,但不给它模块级范围?
更好的是,有没有一种方法可以做到这一点,只在需要时才在内存中?
我认为没有任何方法可以创建一个由小于模块的函数组成的范围(这似乎是您想要的)。
如果您担心意外修改,那么您可以创建一个实现只读数组的类。此类的实例可以设为模块级别,但是一旦设置了项目,它们就不能被修改,也不能被新值替换。
在类模块中:
'Class ROA (Read Only Array)
Private A As Variant
Private initialized As Boolean
Public Property Get Item(i As Long) As Variant
Item = A(i)
End Property
Public Property Let Items(data As Variant)
If Not initialized Then
A = data
initialized = True
Else
Debug.Print "Illegal attempt to modify data"
End If
End Property
测试代码(在标准代码模块中):
Dim A As ROA
Sub test1()
Set A = New ROA
A.Items = Array(3, 1, 4) 'set items once
End Sub
Sub test2()
test1
Debug.Print A.Item(0) 'prints 3
A.Items = Array(5, 6, 7) 'no effect on A
Debug.Print A.Item(0) 'still prints 3
End Sub
When test2
运行输出为:
3
Illegal attempt to modify data
3
当然,您可以创建该类的一个新实例并将其分配给A
。该对象是只读的,而变量本身不是。这应该足以防止意外修改。
上面的代码主要是概念证明。你可以改进它,例如如果您传递的数据不是数组,它会抛出错误。当尝试更改数据而不是简单地记录数据时,您也可以抛出错误而不是不执行任何操作。另外,您可能想尝试一下这个聪明的方法 http://www.cpearson.com/excel/DefaultMember.aspx使Item()
默认方法,以便您可以使用A(0)
而不是A.Item(0)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)