2

たとえば、配列がある場合:

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

4

1 に答える 1

4

値型ではなく参照型を探しているようです。これには、VBA のオブジェクトが必要です。

たとえば、 というクラス モジュールを作成しますDevicePublic value最も単純には、クラス内の唯一のコードとして配置できます。

'Class Device
Public value

これで、オブジェクトを名前で参照し、それらの参照を渡すことができArrayます。たとえば、例の as に入れます。

'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 
于 2013-07-03T18:49:37.383 に答える