Добавление многомерного элемента в массив, а затем извлечение всех элементов одновременно - PullRequest
2 голосов
/ 26 января 2020

Так что я работаю над изучением массивов в VBA.

VBA не очень хорошо обрабатывает массивы, и я нашел. net реализацию в VBA, которая, кажется, работает лучше / чище. Отлично, давайте использовать это!

Итак, я начну с создания своего саба, затемнения массива и установки его:

Sub ArrayTest()
Dim StorageArray as Variant

Set StorageArray = CreateObject("System.Collection.Arraylist")

Ура, рабочий массив! Давайте добавим к нему предметы.

StorageArray.Add "Peter"

For i = 1 to 4
    StorageArray.Add i
Next i

Прекрасно работает!

Давайте достанем из него предметы.

For each Name in StorageArray
    debug.print Name
Next
end sub

Пока все здесь радужно. Теперь я хочу сделать go немного более продвинутым: я хочу добавить многомерные объекты в массив, и я хочу, чтобы массив ВЕСЬ все сразу в Excel. Вот где он ломается.

StorageArray.Add "Peter", "Paul" кричит на меня за неуказанную синтаксическую ошибку. StorageArray.Add ("Peter", "Paul") продолжает кричать на меня.

ShTest.Range("A1").value2 = StorageArray тоже кричит на меня. «Отсутствующий параметр не имеет значения по умолчанию. Имя параметра: Параметры» - это указанная ошибка.

Я знаю, что в какой-то момент я мог выложить весь массив в Excel таким образом, но я строил из чужого кода, к которому у меня больше нет доступа, поэтому я не могу понять, в чем разница is.

Я хочу посмотреть на другие методы массива, но причина, по которой я в первую очередь изучаю это, заключается в том, что у меня большой (~ 70 тыс. строк) файл, для которого требуется таблица без привязки. PowerQuery является учебным пособием для этого, однако у меня нет доступа к нему. Очевидно, SQL также может помочь, но мои SQL знания недостаточно сильны. Двойной l oop работает, но для его обработки требуются буквальные часы, и я знаю, что это можно сделать за считанные минуты. Я подозревал, что большую часть времени занимает запись данных по одной строке за раз в таблицу результатов, поэтому я изучаю массивы, чтобы ускорить процесс.

Ответы [ 2 ]

2 голосов
/ 26 января 2020

Excel VBA обрабатывает массивы особым образом, но в нем есть что-то подходящее только для диапазонов Excel, что, на мой взгляд, хорошо, когда его знают и используют. Кроме того, я думаю, что коллекция не подходит для ваших целей.

Итак, если вы объявляете массивы так, как вы это делали, то создаваемый массив имеет тип на основе 0, и это не сложно использовать многомерный одни, но скажем, более сложные ...

Помимо этого способа объявления, это Excel1 c, работающий так:

Private Sub testArrays()
  Dim arrTest As Variant, rng As Range, sh As Worksheet
   Set sh = ActiveSheet 'use here your sheet
   Set rng = sh.Range("A2:K1000")
     arrTest = rng.Value
     Debug.Print UBound(arrTest, 1), UBound(arrTest, 2)
     'UBound(arrTest, 1) = array rows and UBound(arrTest, 2) = array columns
End Sub

Полученный массив является многомерный тип на основе 1. Вы можете ускорить работу вашего приложения только в памяти, используя такой тип. Вы также можете смешивать вещи, загружая любые типы массивов в al oop, итерируя между этими элементами ... Для вставки сразу используйте следующий код:

Dim shNew As Worksheet
    Set shNew = ActiveWorkbook.Sheets("2")
    shNew.Range("A2:K1000").Value = arrTest

Вы должны только позаботиться о вставке массива в диапазон, имеющий одинаковые строки и столбцы. Конечно, если вам нужны все данные из массива ...

1 голос
/ 26 января 2020

Вам нужна комбинация коллекций и массивов.

Sub ArrayDemo()
    ' We could equally use Dim myArray(1 to 5) as variant
    Dim myArrays As Collection
    Set myArrays = New Collection
    myArrays.Add Array(1, 2, 3, 4, 13, 6, 7, 8)

    Dim myVar As Variant
    myVar = Worksheets("Sheet1").Range("A1:Z20").Value
    myArrays.Add myVar
    myArrays.Add Split("This is a sentence that is split into an array", " ")

    myArrays.Add Array(1, "Hello World", myArrays.Item(1), 3.142, New Collection)
    Debug.Print myArrays.Item(1)(4)
    Debug.Print myArrays.Item(2)(4, 6)
    Debug.Print myArrays.Item(3)(3)

End Sub

В приведенном выше примере я использовал коллекцию для хранения моих массивов, но вы также можете использовать массив вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...