我想声明一个带有键值的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
答案 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