如何将数组中的值作为变量引用?

时间:2013-07-03 16:23:58

标签: vba excel-vba excel

例如,如果我有数组:

DeviceArray = Array("Sw","Cap","Gen","Reg","Tr","Br")

我想将所有内容初始化为一个值,例如0,这相当于为此编写for循环,以便将数组中的值视为变量名,以便我可以间接修改变量值:

For i = 0 to ubound(DeviceArray)
     DeviceArray(i) = 0
Next i

这样在运行代码之后,变量: Sw,Cap,Gen,Reg,Tr和Br都应设置为0。

将DeviceArray中的每个元素更改为0,不再存储最初放置的字符串。

因此DeviceArray应保持不变并仍然存储值(“Sw”,“Cap”,“Gen”,“Reg”,“Tr”,“Br”)

希望清楚地解释我想要做的事情,我试图这样做,所以我不必输入:

Sw = 0
Cap = 0
Gen = 0
Reg = 0
Tr = 0
Br = 0

因为有很长的变量列表需要在整个宏中不断重新初始化为不同的值。

例如,DeviceArray(0)= Sw,但我希望vba宏将DeviceArray(0)识别为变量Sw的名称,这样我就可以修改变量Sw的值而不直接调用它。

1 个答案:

答案 0 :(得分:4)

听起来您正在寻找引用类型而不是值类型。为此,您需要在VBA中使用Object。

例如,创建一个名为Device的类模块。最简单的方法是将Public value作为Class中唯一的代码。

'Class Device
Public value

现在,您可以按名称引用对象并传递这些引用,例如将它们放入Array中,如示例所示。

'Within a normal module

Public Sub test()
    Dim Sw As New Device
    Dim Cap As New Device
    Dim Gen As New Device
    Dim Reg As New Device
    Dim Tr As New Device
    Dim Br As New Device

    DeviceArray = Array(Sw, Cap, Gen, Reg, Tr, Br)
    For i = LBound(DeviceArray) To UBound(DeviceArray)
       DeviceArray(i).value = 42
    Next i

    Debug.Print Gen.value
End Sub

'Output is 42

或者,根据您的需要,哈希映射也可能起到作用,在这种情况下,您不会声明变量,而是在地图中引用它们的条目。

Public Sub test2()
    Dim Devices As Object, DeviceArray
    Set Devices = CreateObject("Scripting.Dictionary")
    DeviceArray = Array("Sw", "Cap", "Gen", "Reg", "Tr", "Br")

    For i = 0 To UBound(DeviceArray)
        Devices(DeviceArray(i)) = 0
    Next i

    Debug.Print "Gen init to ", Devices("Gen")

    Devices("Gen") = 42

    Debug.Print "Gen is now ", Devices("Gen")

    For i = 0 To UBound(DeviceArray)
        Devices(DeviceArray(i)) = 0
    Next i

    Debug.Print "Gen reset to ", Devices("Gen")
End Sub


'Gen init to    0 
'Gen is now     42 
'Gen reset to   0