Добавить массив ArrayList за один раз - PullRequest
1 голос
/ 23 сентября 2019

Фон:

Я пытаюсь заполнить объект ArrayList из любого заданного массива значений.

Чтобы заполнить эти объекты, вы можете использовать *Метод 1008 * или метод .AddRange, однако в любом случае кажется, что для заполнения ArrayList необходимо выполнить итерацию по массиву.И, очевидно, чтобы использовать .AddRange, нам нужно использовать объект Queue.

Код:

Пример метода .Add:

Sub Test1()

Dim ArrList As Object: Set ArrList = CreateObject("System.Collections.ArrayList")

With ArrList
    For Each ArrItem In Array("A", "B", "C")
        If Not .contains(ArrItem) Then .Add ArrItem
    Next
End With

End Sub

Пример метода .AddRange:

Sub Test2()

Dim ArrList As Object: Set ArrList = CreateObject("System.Collections.ArrayList")
Dim Q As Object: Set Q = CreateObject("System.Collections.Queue")

With Q
    For Each ArrItem In Array("A", "B", "C")
        If Not .contains(ArrItem) Then .Enqueue ArrItem
    Next
End With

ArrList.AddRange Q

End Sub

Вопрос:

Как видите, мне интересно, какова цель метода .AddRange, если мы не можем назначить массив напрямую.Нам по-прежнему приходилось итерировать и .Enqueue их.

Так что можно сделать, чтобы назначить массив сразу?Очевидно, что из-за ошибки (5) выйдет следующее:

ArrList.AddRange Array("A", "B", "C")

Кстати, для раннего связывания добавьте ссылку mscorlib.dll.

1 Ответ

1 голос
/ 23 сентября 2019

Проблема в том, что ArrayList является объектом .NET, а метод AddRange() ожидает параметр типа ICollection.Теперь массив VBA не является объектом ICollection (т. Е. Он не реализует ICollection интерфейс .NET), поэтому вызов метода завершается неудачей.

Причина Queueобъект работает в том, что он реализует ICollection.Любой другой объект ICollection тоже будет работать.Например, если у вас есть другой ArrayList, вы можете передать его в метод AddRange, и он будет работать нормально.Попробуйте это, например:

Sub Test()
    Dim ArrList1 As Object: Set ArrList1 = CreateObject("System.Collections.ArrayList")
    Dim ArrList2 As Object: Set ArrList2 = CreateObject("System.Collections.ArrayList")

    ArrList1.Add "A"
    ArrList1.Add "B"
    ArrList1.Add "C"

    ArrList2.AddRange ArrList1
End Sub

Итак, суть в следующем: Я думаю, вам не повезло, используя массив VBA для перехода к методу ArrayList.AddRange().

...