Excel VBA字典像声明,初始化和访问

我想宣布一个关键字的字典,并访问它。 我正在使用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指点我不需要中间variables。

 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 

你不能在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 

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

 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 

你在混淆。

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

VBA中的字典使用如下:

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

然后创buildMS脚本字典:

 Set MSdict = CreateObject("Scripting.Dictionary") 

因此添加您的值:

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