Redim Preserve на l oop вызывает ошибку Subscript вне диапазона - PullRequest
0 голосов
/ 10 февраля 2020

Я зацикливаю папку и динамически передаю различные элементы в массив. Когда массив пуст и я ReDim, он увеличивается в размере, но когда массив имеет значения, и я пытаюсь ReDim Preserve, я получил ошибку:

Индекс вне диапазона

Код:

Dim arrNames As Variant

Do While Len(StrFile) > 0

    'If array is empty
    If Counterarr = 0 Then
        'Add a line to the array
        ReDim arrNames(Counterarr, 1 To 3)
    Else
        'Keep the values and add new
        ReDim Preserve arrNames(Counterarr)
    End If

    'Import document name
    arrNames(Counterarr, 1) = Trim(Replace(Trim(StrFile), ".xlsx", ""))
    'Import Year
    arrNames(Counterarr, 2) = Trim(Left(Trim(Split(Trim(Replace(Trim(StrFile), ".xlsx", "")), " ")(1)), 4))
    'Import Month
    arrNames(Counterarr, 3) = Right(Trim(Split(Trim(Replace(Trim(StrFile), ".xlsx", "")), " ")(1)), 2)

    Counterarr = Counterarr + 1

    StrFile = Dir

Loop

Изображение:

При инициализации массива:

enter image description here

Любой совет, как импортировать ArrNames(1) et c?

Ответы [ 2 ]

3 голосов
/ 10 февраля 2020

В соответствии с документацией оператора ReDim :

Если вы используете ключевое слово Preserve, вы можете изменить размер только последнего измерения массива и не сможете изменить количество измерений на всех. Например, если ваш массив имеет только одно измерение, вы можете изменить его размер, потому что это последнее и единственное измерение. Однако, если у вашего массива есть два или более измерений, вы можете изменить размер только последнего измерения и сохранить содержимое массива.

Означает, что вы не можете изменить размер первого измерение, но только последнее

ReDim arrNames(FirstDim, SecondDim)

Но вместо многомерных массивов вы можете использовать массив внутри массива.

Пример:

Option Explicit

Public Sub ArrayExample()
    Dim Arr() As Variant 'this is your outer array (container)

    Dim a As Long
    For a = 1 To 10
        ReDim Preserve Arr(1 To a) 'resize the outer array by +1

        ReDim OtherArr(1 To 3) As String 'this is a brand new inner array (each iteration)
        OtherArr(1) = "Item 1"
        OtherArr(2) = "Item 2"
        OtherArr(3) = "Item 2"

        Arr(a) = OtherArr 'here we write the inner array into the outer 
    Next a
End Sub

enter image description here

И вы можете легко получить к нему доступ, как Debug.Print Arr(2)(3). Обратите внимание, что Arr(2) обращается к внешнему массиву, а Arr(2)(3) обращается к массиву внутри этого массива. Это отличается от двумерного массива, к которому можно получить доступ как Arr(2,3).

0 голосов
/ 10 февраля 2020

Чтобы добавить новую перспективу:

Я бы не стал использовать ReDim Preserve внутри al oop, особенно если в нем будет много итераций. См. эту или эту запись в блоге .

Альтернативным решением может быть использование Collection вместо этого. Здесь вы можете добавлять элементы в коллекцию на лету, например, следующим образом:

Dim fso As Object, oFile as Object
Dim my_coll as Collection

Set fso = CreateObject("Scripting.FileSystemObject")
Set my_coll = New Collection

For Each oFile in fso.GetFolder(pathToFolder).Files
   Dim strArr(1 To 3) As String
   strArr(1) = Left(oFile.Name, Len(oFile.Name)-Len(".xslx"))
   ...
   my_coll.Add strArr
Next

Затем вы можете затем выполнить итерацию по коллекции следующим образом:

Dim it as Variant

For each it in my_coll
   Debug.Print it(1) 'Returns the Name
Next

Вам нужно будет включить Object Library для использования Collection.

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