Public Sub DoSomeThing()
Dim dict As Object
Dim arr2(5)
Set arr2() = aaa()
For m = LBound(arr2) To UBound(arr2)
Set dict = aaa()(m)
Dim key As Variant
For Each key In dict.Keys
Debug.Print dict(key)
Next key
Next
End Sub
Public Function aaa() As Variant
Dim arr(5)
Dim dict_123 As Object
For k = 1 To 2
If k = 1 Then
val1 = 300
val2 = 500
ElseIf k = 2 Then
val1 = 600
val2 = 1200
End If
Set dict_123 = CreateObject("Scripting.Dictionary")
dict_123.Add "first", val1
dict_123.Add "Second", val2
Set arr(k) = dict_123
Next
aaa = arr
End Function
在这里,我希望将数组从aaa
返回到DoSomething
,然后从DoSomeThing
处理该数组。我怎么能这样做?
我收到错误,因为无法分配给数组
答案 0 :(得分:2)
有很多错误,我不确定你想要实现的整体目标。您的代码"已修复"下方。
注意:
arr2 = aaa
设置一个数组等于另一个数组(没有set关键字作为非对象)。不要首先标注arr2
。arr2
)项是否为字典。您只在基于0的数组中的索引1和2处添加了词典。不太健壮的是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