Excel VBA dict类似于声明,初始化和访问

时间:2015-01-20 13:27:45

标签: excel vba excel-vba

我想声明一个带有键值的dict并访问它。我正在使用Excel VBA,但我收到错误(Excel 2010)。

我想声明的结构是这个(Python表示法):

ktable = {'a': [1.0, 2.0, 3.0],
          'b': [2.0, 3.0, 4.0],
          'c': [5.0, 0.0, 6.0],
          'd': [8.0, 0.0, 9.0],
          'e': [1.5, 0.5, 0.0],
          'f': [0.0, 0.5, 1.0]}

我的代码是:

Public ktable As New Collection
Dim kt_a: kt_a = Array(1# , 2# , 3# )
Dim kt_b: kt_b = Array(2# , 3# , 4# )
Dim kt_c: kt_c = Array(5# , 0# , 6# )
Dim kt_d: kt_d = Array(8# , 0# , 9# )
Dim kt_e: kt_e = Array(1.5, 0.5, 0# )
Dim kt_f: kt_f = Array(0# , 0.5, 1# )
ktable.Add kt_a, "a"
ktable.Add kt_b, "b"
ktable.Add kt_c, "c"
ktable.Add kt_d, "d"
ktable.Add kt_e, "e"
ktable.Add kt_f, "f"

Sub test()
    Debug.Print ktable.Item("a")(1)
End Sub

我做错了什么?我得到'运行时错误424'。

编辑:

好的,到目前为止,我们能够使用以下代码,使用两个答案的信息 - 特别是关于使用工具的评论 - >参考非常有帮助。会等一段时间然后

Option Explicit

Public ktable

Sub INIT_CONSTANTS()
    'ktable={'a' : [ 1.0 , 2.0  ,  3.0  ],
             'b' : [ 2.0 , 3.0  ,  4.0  ],
             'c' : [ 5.0,  0.0  ,  6.0  ],
             'd' : [ 8.0,  0.0  ,  9.0  ],
             'e' : [ 1.5,  0.5  ,  0.0  ],
             'f' : [ 0.0,  0.5  ,  1.0  ]}
    Set ktable = CreateObject("Scripting.Dictionary")
    If Not ktable.Exists("a") Then
        Dim kt_a: kt_a = Array(1# , 2# , 3# )
        Dim kt_b: kt_b = Array(2# , 3# , 4# )
        Dim kt_c: kt_c = Array(5# , 0# , 6# )
        Dim kt_d: kt_d = Array(8# , 0# , 9# )
        Dim kt_e: kt_e = Array(1.5, 0.5, 0# )
        Dim kt_f: kt_f = Array(0# , 0.5, 1# )
        ktable.Add "a", kt_a
        ktable.Add "b", kt_b
        ktable.Add "c", kt_c
        ktable.Add "d", kt_d
        ktable.Add "e", kt_e
        ktable.Add "f", kt_f
    End If
End Sub

Sub test()
INIT_CONSTANTS
    Debug.Print ktable.Item("a")(0)
End Sub

EDIT2:

好的,最短的答案如下。感谢@Rory指点我不需要中间变量。

Option Explicit

Public ktable

Sub INIT_CONSTANTS()
    Set ktable = CreateObject("Scripting.Dictionary")
    If Not ktable.Exists("a") Then
        ktable.Add "a", Array(1# , 2# , 3# )
        ktable.Add "b", Array(2# , 3# , 4# )
        ktable.Add "c", Array(5# , 0# , 6# )
        ktable.Add "d", Array(8# , 0# , 9# )
        ktable.Add "e", Array(1.5, 0.5, 0# )
        ktable.Add "f", Array(0# , 0.5, 1# )
    End If
End Sub

Sub test()
INIT_CONSTANTS
    Debug.Print ktable.Item("a")(0)
End Sub

2 个答案:

答案 0 :(得分:1)

你正在制造一些混乱。

Python list == VBA collection
Python dictionary == Microsoft Scripting dictionary

VBA中的词典使用如下:

前提条件:将MS Scripting Runtime引用到您的工具/参考中。

然后创建MS Scripting词典:

Set MSdict = CreateObject("Scripting.Dictionary")

因此添加您的值:

If Not MSdict.Exists(key) Then 
    MSdict.Add key, value
End If 

答案 1 :(得分:1)

您无法在Sub之外进行此类初始化。这有效:

Public ktable As New Collection

Sub test()
    Dim kt_a: kt_a = Array(1#, 2#, 3#)
    Dim kt_b: kt_b = Array(2#, 3#, 4#)
    Dim kt_c: kt_c = Array(5#, 0#, 6#)
    Dim kt_d: kt_d = Array(8#, 0#, 9#)
    Dim kt_e: kt_e = Array(1.5, 0.5, 0#)
    Dim kt_f: kt_f = Array(0#, 0.5, 1#)
    ktable.Add kt_a, "a"
    ktable.Add kt_b, "b"
    ktable.Add kt_c, "c"
    ktable.Add kt_d, "d"
    ktable.Add kt_e, "e"
    ktable.Add kt_f, "f"
        Debug.Print ktable.Item("a")(1)
End Sub

或者更典型的是,使用某种形式的“初始化”子,如下所示:

Public ktable As New Collection

Sub INIT_thing(ByRef C As Collection)
    Dim kt_a: kt_a = Array(1, 2, 3)
    Dim kt_b: kt_b = Array(2, 3, 4)
    Dim kt_c: kt_c = Array(5#, 0#, 6#)
    Dim kt_d: kt_d = Array(8#, 0#, 9#)
    Dim kt_e: kt_e = Array(1.5, 0.5, 0#)
    Dim kt_f: kt_f = Array(0#, 0.5, 1#)
    C.Add kt_a, "a"
    C.Add kt_b, "b"
    C.Add kt_c, "c"
    C.Add kt_d, "d"
    C.Add kt_e, "e"
    C.Add kt_f, "f"

End Sub

Sub test()
   Call INIT_thing(ktable)
   Debug.Print ktable.Item("a")(1)
End Sub