在VBA中,您可以创建并填充字典,例如:
Dim oDict As Object
Set oDict = CreateObject("Scripting.Dictionary")
oDict("key 1") = "value 1"
oDict("key 2") = "value 2"
oDict("key 3") = "value 3"
通过Keys method,您可以将密钥作为数组获取:
返回一个包含Dictionary对象中所有现有键的数组。
Dim aKeys() As Variant
aKeys = oDict.Keys
Debug.Print VarType(aKeys) ' prints "8204"
Debug.Print VarType(oDict.Keys) ' prints "8204"
但是当我直接访问其中一个键时,它会显示以下错误消息:
Debug.Print aKeys(2) ' prints "key 3"
Debug.Print oDict.Keys(2) ' Run-time error '451':
' Property let procedure not defined
' and property get procedure did not
' return an object
虽然以上是我不了解的主要行为,但在尝试将oDict.Keys
作为数组进行处理的完整列表下面:
Option Explicit
Public Function ArrayGet(ByRef aArray() As Variant, i As Integer) As Variant
ArrayGet = aArray(i)
End Function
Public Function ArrayWrap(ByRef aArray() As Variant) As Variant()
ArrayWrap = aArray
End Function
Public Sub TEST()
Dim oDict As Object
Set oDict = CreateObject("Scripting.Dictionary")
oDict("key 1") = "value 1"
oDict("key 2") = "value 2"
oDict("key 3") = "value 3"
Dim aKeys() As Variant
aKeys = oDict.Keys
Debug.Print VarType(aKeys) ' prints "8204"
Debug.Print VarType(oDict.Keys) ' prints "8204"
Debug.Print aKeys(2) ' prints "key 3"
'Debug.Print oDict.Keys(2) ' Run-time error '451': Property let procedure not defined and property get procedure did not return an object
'Debug.Print oDict.Keys.Get(2) ' Run-time error '424': Object required
'Debug.Print oDict.Keys.Item(2) ' Run-time error '424': Object required
Debug.Print ArrayGet(aKeys, 2) ' prints "key 3"
'Debug.Print ArrayGet(oDict.Keys, 2) ' Compile error : Type mismatch: array or user-defined type expected
'Debug.Print Array(aKeys)(2) ' Run-time error '9' : Subscript out of range
'Debug.Print Array(oDict.Keys)(2) ' Run-time error '9' : Subscript out of range
Debug.Print ArrayWrap(aKeys)(2) ' prints "key 3"
'Debug.Print ArrayWrap(oDict.Keys)(2) ' Compile error : Type mismatch: array or user-defined type expected
Dim key As Variant
For Each key In aKeys
Debug.Print key ' prints "key 1", "key 2" and "key 3"
Next key
For Each key In oDict.Keys
Debug.Print key ' prints "key 1", "key 2" and "key 3"
Next key
End Sub
答案 0 :(得分:3)
Debug.Print oDict.Keys(2) ' Run-time error '451':
' Property let procedure not defined
' and property get procedure did not
' return an object
Keys
字是一种方法。尽管VBA允许您在不提供参数时删除括号,但它仍然是一种方法。如果在其后面指定括号,则内容将传递给该方法。 Keys
方法不接受整数参数。
通过显式提供Keys方法的括号(例如Keys()
),我们可以直接应用/跟随括号以访问数组元素。
与问题中的示例一致:以下两个替代方案是等效的:
Debug.Print aKeys(2) ' prints "key 3"
Debug.Print oDict.Keys()(2) ' prints "key 3"
答案 1 :(得分:3)
如果不添加对Microsoft Scripting Runtime的引用,则需要使用后期绑定来使用字典对象。后期绑定会使您失去一些功能。
如果尝试按索引访问字典的键,则会抛出运行时错误451。
运行时错误'451':
属性让过程未定义,属性获取过程未返回对象。
如果您通过VBE的工具将Microsoft脚本运行时库引用添加到项目中,则引用现在可以直接通过其序数索引号访问字典的键。
Sub test3()
Dim i As Long, dict As New Scripting.dictionary
dict.Add Key:="key1", Item:="item1"
dict.Add Key:="key2", Item:="item2"
dict.Add Key:="key3", Item:="item3"
For i = LBound(dict.Keys) To UBound(dict.Keys)
Debug.Print dict.Keys(i)
Next i
End Sub
'results
key1
key2
key3