Excel VBA dict like声明、初始化和访问
Excel VBA dict like declaration, initialiazation and accessing
我想声明一个带有键值的字典并访问它。我正在使用 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
我做错了什么?我得到 'Runtime Error 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
编辑 2:
好的,最短答案如下。感谢@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
你在制造一些混乱。
Python list == VBA collection
Python dictionary == Microsoft Scripting dictionary
VBA中的词典用法如下:
先决条件: 将 MS Scripting Runtime
引用到您的 Tools/References 中。
然后创建 MS 脚本字典:
Set MSdict = CreateObject("Scripting.Dictionary")
因此请添加您的值:
If Not MSdict.Exists(key) Then
MSdict.Add key, value
End If
您不能在 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
或者更典型地,使用某种形式的 "initialising" 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
我想声明一个带有键值的字典并访问它。我正在使用 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
我做错了什么?我得到 'Runtime Error 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
编辑 2:
好的,最短答案如下。感谢@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
你在制造一些混乱。
Python list == VBA collection
Python dictionary == Microsoft Scripting dictionary
VBA中的词典用法如下:
先决条件: 将 MS Scripting Runtime
引用到您的 Tools/References 中。
然后创建 MS 脚本字典:
Set MSdict = CreateObject("Scripting.Dictionary")
因此请添加您的值:
If Not MSdict.Exists(key) Then
MSdict.Add key, value
End If
您不能在 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
或者更典型地,使用某种形式的 "initialising" 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