vba - 有没有办法设置一个变量一次并在多个地方使用它而不给它模块级别的范围?

标签 vba excel

我有一个循环将用户窗体控件添加到集合中。

由于多个地方都需要该集合,因此我将其放入模块中并在需要时调用它。
这意味着该集合仅在需要时才位于内存中,但这也意味着我每次想要使用它时都会运行一个循环。

可以给出集合模块级别范围并在第一次需要时创建它。
我会运行一次循环,但集合会保留在内存中。

我发现 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

当运行 test2 时,输出为:

 3 
Illegal attempt to modify data
 3 

当然,您可以创建该类的一个新实例并将其分配给A。该对象是只读的,而变量本身不是。这应该足以防止意外修改。

上面的代码主要是概念证明。你可以改进它,例如如果您传递的数据不是数组,它会抛出错误。当尝试更改数据而不是简单地记录数据时,您也可以抛出错误而不是不执行任何操作。另外,您可能想尝试 this clever way使 Item() 成为默认方法,以便您可以只使用 A(0) 而不是 A.Item(0)

关于vba - 有没有办法设置一个变量一次并在多个地方使用它而不给它模块级别的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45253851/

相关文章:

使用方法声明 "_Something"在 VBA(Excel) 中导入 C++ dll

vba - 如果字典不存在则添加

vba - Excel VBA - 带分隔符和单引号的字符串连接

vba - 我可以在 Excel 2010 Starter Edition 中使用 VBA 吗?

excel - 是否可以使用硬编码的值列表而不是范围公式中的范围?

windows - 模拟物理键盘按下的脚本,以便 PC 保持唤醒状态

java - 将 CSV 文件转换为 XLS 时出现问题

mysql - excel将mysql日期格式作为文本格式

c# - 为什么 Excel VSTO 插件在更高规范的机器上运行得更慢?

vba - ThisWorkbook.ChangeFileAccess xlReadWrite 在 VBA 窗口中为工作簿创建多个 VBAProject