返回Array并从调用函数分配给数组

时间:2018-06-11 08:01:19

标签: vba

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处理该数组。我怎么能这样做?

我收到错误,因为无法分配给数组

1 个答案:

答案 0 :(得分:2)

有很多错误,我不确定你想要实现的整体目标。您的代码"已修复"下方。

注意:

  1. arr2 = aaa设置一个数组等于另一个数组(没有set关键字作为非对象)。不要首先标注arr2
  2. 在尝试设置之前,测试当前数组(arr2)项是否为字典。您只在基于0的数组中的索引1和2处添加了词典。不太健壮的是If m = 1 Or m = 2
  3. 使用Option Explicit并声明所有变量
  4. 我更喜欢函数中的Select CaseIf语句,特别是如果您想要添加更多条件,您可能希望在多个条件下获得相同的结果。
  5. 代码:

    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