context
In VBA you can create and fill a dictionary like:
Dim oDict As Object Set oDict = CreateObject("Scripting.Dictionary") oDict("key 1") = "value 1" oDict("key 2") = "value 2" oDict("key 3") = "value 3" With the Keys method you can get the keys as array:
Returns an array containing all existing keys in a Dictionary object.
Dim aKeys() As Variant aKeys = oDict.Keys Debug.Print VarType(aKeys) ' prints "8204" Debug.Print VarType(oDict.Keys) ' prints "8204" the problem
But when I access one of the keys directly it gives this cryptic error message:
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 failed attempts to solve
While the above is the main behavior I did not understand below the full list of attempts to handle oDict.Keys as array:
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 
