Как создать многомерный массив неизвестного размера? - PullRequest
1 голос
/ 26 марта 2019

У меня есть простая проблема:

  • У меня есть набор данных, который я просеиваю и добавляю в массив при совпадении критериев
  • ПроблемаЯ не знаю, сколько совпадений может быть, поэтому мне нужно, чтобы массив был неопределенного размера.
  • Второй индекс массива является статическим.

В (псевдо-язык) пример:

if <matched criteria> = True {
    i = i + 1
    array( i,  1 ) => "John Doe" ' name
    array( i,  2 ) => "New York" ' location
    array( i,  3 ) => "02. 08. 1992" ' birthdate
}

Проблема в том, что в необходимо предварительно объявить массивы (особенно сOption Explicit включено).Мой мыслительный процесс состоял в том, чтобы объявить массив, который начинался бы с первого индекса в 0, и я постепенно ReDim использовал бы его по мере необходимости.

Вот упрощенный пример моего кода:

Dim cell as Range
Dim arr(0, 1 to 3) as String
Dim i As Integer: i = 0

For each cell in Range("A1:A100")
  If criteria_match(cell) = True Then
      arr(i, 1) = Cells(cell.row, 4)
      arr(i, 2) = Cells(cell.row, 5)
      arr(i, 3) = Year(Cells(cell.row, 6))
      i = i + 1
      ReDim Preserve arr(i, 1 to 3)
  End If
Next cell

Проблема в том, что возникает исключение:

enter image description here

Возможно, есть какой-нибудь способ, я мог бы неуклонно увеличивать размер индекса первого массивав зависимости от необходимости?

Ответы [ 2 ]

3 голосов
/ 26 марта 2019

Не увеличивайте размер массива в операторе объявления переменной.

Изменение:

Dim arr(0, 1 to 3) as String

до:

Dim arr() as String
ReDim arr(1 to 3, i)

Измените размер по мере необходимости.

Edit: Для получения дополнительной информации см. Эту ссылку: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/array-already-dimensioned

Чтобы кратко подвести итог, при определении размера массива в операторе объявления он создает статический массив (размер которого не может быть изменен). Когда вы не объявляете размер, он становится динамическим массивом, размер которого можно изменить.


Важное замечание: ReDim Preserve можно применить только к последнему измерению массива

например. ReDim Preserve arr(1 to 3, i) будет работать.
Между тем ReDim Preserve arr (i, 1 to 3) не будет.

2 голосов
/ 26 марта 2019

Используйте тип для данных и коллекцию для переменных на основе типа.

Class Person

Public Name As String
Public Location As String
Public DoB As Date

В модуле

Sub Test()

    Dim this_person As Person
    Dim Persons As Collection
    Dim my_cell                 As Excel.Range
    Set Persons = New Collection

    For Each my_cell In Range("A1:A100")

      If Criteria_Match(my_cell) Then

        Set this_person = New Person
        With this_person

            .Name = ActiveWorkbook.ActiveWorksheet.Cells(my_cell.Row, 4).Value2
            .Location = ActiveWorkbook.ActiveWorksheet.Cells(my_cell.Row, 5).Value2
            .DoB = Year(ActiveWorkbook.ActiveWorksheet.Cells(my_cell.Row, 6).Value2)

        End With

        Persons.Add this_person

      End If

    Next

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