«Индекс вне диапазона» в массиве, преобразованном из диапазона - PullRequest
0 голосов
/ 13 июля 2020

Я видел довольно много вопросов / ответов по этим строкам, но, прочитав их кучу, я все еще в замешательстве. Прошу прощения, если это nᵗʰ раз, когда был задан вариант этого.

Я не могу понять, почему этот код умирает в строке 5 с ошибкой «индекс вне допустимого диапазона» в VBA (Excel для Ma c v16.38):

Public Function array_test()
    Dim arr As Variant
    Dim array_slice As Variant
    arr = Range("TestData!B27:F32").Value2
    array_slice = arr(2)  'dies here with error 9
    array_test = array_slice
End Function

Если посмотреть на панель значений, arr явно является Вариантом / Вариантом (от 1 до 6, от 1 до 5) со всеми ожидаемыми данными. В ячейках нет ничего особенного, только данные, не являющиеся формулами.

Даже если я изменю объявления на arr () и array_slice () или удалю «.Value2», я получу те же результаты. Даже попытка Application.WorksheetFunction.Index (arr, 2) вместо arr (2) ни к чему не приведет.

Что мне не хватает?

PS Я программист на C / Python обычно, поэтому я думаю о массивах именно в этом смысле.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Обычно для его элементов используется 2D-массив oop, однако, поскольку вы специально упомянули, что хотите разрезать его через VBA, вы можете использовать Application.Index. Например, попробуйте:

array_slice = Application.Index(arr, 2, 0) 'Slice 2nd row into 1D-array.

Идея состоит в том, чтобы скормить Application.Index stati c '2', которая представляет интересующую строку. Таким же образом вы можете нарезать интересующий столбец c, хотя, если вам нужно, чтобы это был 1D-массив, вам нужно будет использовать Application.Transpose, однако у этого метода есть ограничения:

With Application
    array_slice = .Transpose(.Index(arr, 0, 2)) 'Slice 2nd column into 1D-array.
End With
0 голосов
/ 13 июля 2020

Когда вы копируете данные из диапазона, а диапазон содержит более одной ячейки, вы в любом случае получаете n 2-мерный массив (даже если у вас только одна строка или один столбец).

Для доступа одно значение из этого массива, вы должны предоставить оба индекса, например arr(2, 1). Однако, если вы хотите получить один -мерный массив, содержащий все значения из строки (первый индекс) или столбца (второй индекс), вы нужно создать этот массив самостоятельно - в VBA нет функции slice. Вы можете измерить массив во время выполнения с помощью команды ReDim:

Dim array_slice(), i As Long
ReDim array_slice(LBound(arr, 1) To UBound(arr, 1))
For i = LBound(arr, 1) To UBound(arr, 1)
    array_slice(i) = arr(i, 2)
Next i

Чтобы получить значения столбца, используйте

Dim array_slice(), i As Long
ReDim array_slice(LBound(arr, 2) To UBound(arr, 2))
For i = LBound(arr, 2) To UBound(arr, 2)
    array_slice(i) = arr(2, i)
Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...