ReDim Preserve 2-мерный вариантный массив - PullRequest
1 голос
/ 21 марта 2019

Похоже, это миллионный вопрос по этой теме, но поиск мне не помог.

Я пытаюсь изменить размер последнего измерения двумерного массива, но всегда получаю ошибку "index out of bounds" в строке ReDim Preserve.

enter image description here

Dim arrCurrentDataset As Variant

For i = 0 To UBound(fileNames) - 1

    strPath = fileNames(i)

    Set wkbSource = Workbooks.Open(Filename:=strPath, UpdateLinks:=xlUpdateLinksNever, ReadOnly:=True, Notify:=True)
    Set wksSource = wkbSource.Sheets(1)

    Dim lngRows As Long
    lngRows = wksSource.UsedRange.SpecialCells(xlCellTypeLastCell).Row

    'Store dataset to array and afterwards increase second dimension by 2 -> create space to add Materialart and Beschaffungsart
    arrCurrentDataset = wksSource.Range("A4:I" & lngRows).value
    ReDim Preserve arrCurrentDataset(UBound(arrCurrentDataset, 1), UBound(arrCurrentDataset, 2) + 2)

    '...

next i

Есть ли проблема с моей декларацией? Я неявно пытаюсь изменить тип данных?

Большое спасибо за вашу помощь!

Ответы [ 2 ]

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

Размеры вашего массива основаны на 1, но по умолчанию это 0 (если у вас нет оператора Option Base 1), поэтому вы должны указать это в Redim:

ReDim Preserve arrCurrentDataset(1 to UBound(arrCurrentDataset, 1), 1 to UBound(arrCurrentDataset, 2) + 2)
0 голосов
/ 21 марта 2019

Когда вы объявляете переменную как Variant, она может быть чем угодно.Это может быть массивом или 2-мерным массивом , но также может быть объектом, строкой или чем-то еще.

Так что, когда вы хотитечтобы быть массивом, вы должны использовать Redim -команду.Но когда вы нажмете на Redim в первый раз, у вас еще нет массива, поэтому Ubound потерпит неудачу (это допустимо только для массивов) - и, поскольку это не массив, сохранить также нечего.

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

If isArray(arrCurrentDataset) Then
   ReDim Preserve arrCurrentDataset(1 to UBound(arrCurrentDataset, 1), 1 to UBound(arrCurrentDataset, 2) + 2)
Else
   ' You have to make up your mind about the initial size of the array
   ReDim arrCurrentDataset(1 to 10, 1 to 10)
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...