Есть много ошибок, и я не уверен, что вы пытаетесь достичь в целом.Ваш код выше «исправлено» ниже.
Примечания:
arr2 = aaa
установить один массив равным другому (не устанавливать ключевое слово как не объект).Не измеряйте arr2
first. - Проверьте, является ли текущий элемент массива (
arr2
) словарём, прежде чем пытаться установить.Вы только добавили словари с индексами 1 и 2 в массиве на основе 0.Менее устойчивым будет If m = 1 Or m = 2
- Используйте
Option Explicit
и объявите все свои переменные - Я предпочитаю
Select Case
в функции для оператора If
, особенно если вы хотите добавить больше условийгде вам может потребоваться один и тот же результат для более чем одного условия.
Код:
Option Explicit
Public Sub DoSomeThing()
Dim dict As Object, arr2, m As Long, key As Variant
arr2 = aaa '<==Set one array equal to the other (no set keyword as not object)
For m = LBound(arr2) To UBound(arr2)
If TypeName(arr2(m)) = "Dictionary" ' <== We can test if current array item is a dictionary before attempting the set. You have only added dictionaries at position 1 and 2 in the array. Less robust would be If m = 1 Or m = 2
Set dict = arr2(m) '<==index into your arr2 array
For Each key In dict.Keys
Debug.Print dict(key)
Next key
End If
Next
End Sub
Public Function aaa() As Variant
Dim arr(5), k As Long, val1 As Long, val2 As Long, dict_123 As Object
For k = 1 To 2
Select Case k '<== Use select statement
Case 1
val1 = 300
val2 = 500
Case 2
val1 = 600
val2 = 1200
End Select
Set dict_123 = CreateObject("Scripting.Dictionary")
dict_123.Add "first", val1
dict_123.Add "Second", val2
Set arr(k) = dict_123 'K starts at 1 so position 0 is empty; as are positions after 2.
Next k
aaa = arr
End Function