Возвращаем Array и присваиваем массиву из вызывающей функции - PullRequest
0 голосов
/ 11 июня 2018
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 голосов
/ 11 июня 2018

Есть много ошибок, и я не уверен, что вы пытаетесь достичь в целом.Ваш код выше «исправлено» ниже.

Примечания:

  1. arr2 = aaa установить один массив равным другому (не устанавливать ключевое слово как не объект).Не измеряйте arr2 first.
  2. Проверьте, является ли текущий элемент массива (arr2) словарём, прежде чем пытаться установить.Вы только добавили словари с индексами 1 и 2 в массиве на основе 0.Менее устойчивым будет If m = 1 Or m = 2
  3. Используйте Option Explicit и объявите все свои переменные
  4. Я предпочитаю 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...