Индекс VBA вне диапазона при распределении значений по первому и второму измерениям многомерного массива Dynami c - PullRequest
1 голос
/ 18 марта 2020

Я создаю многомерный массив Dynami c, который имеет 3 измерения. Когда я пытаюсь присвоить значение первому и второму измерению, я получаю ошибку Subscript Out of Range.

Мой код:

Dim wb as Workbook, filNme  as String, y As Integer, i As Long, rng As Long
Dim hArr() As Variant, dimen1 As Long, dimen2 As Long, dimen3 As Long
Dim tArr() As Variant, dim1 As Long, dim2 As Long, dim3 As Long, dim4 As Long
i = 0
filNme = "Test1"
Set wb = Application.Workbooks.Open(Environ("UserProfile") & "\Desktop\" & filNme & ".xlsx")
With wb    
    For y = 1 To .Worksheets.Count
        If .Worksheets(y).Range("R5").Value = 1 Then
            i = .Worksheets(y).Range("B88").End(xlUp).Row
            rng = .Worksheets(y).Range("B48:B" & i).Count - 1
            ReDim hArr(0, 0, 0 To rng)
            hArr(0) = CStr(.Worksheets(y).Range("B7").Value) 'Gives Subscript Out of Range error
            hArr(0, 0) = .Worksheets(y).Range("B8").Value 'Gives Subscript Out of Range error
            For dimen1 = LBound(hArr, 1) To UBound(hArr, 1)
                For dimen2 = LBound(hArr, 2) To UBound(hArr, 2)
                    For dimen3 = LBound(hArr, 3) To UBound(hArr, 3)
                        hArr(dimen1, dimen2, dimen3) = .Worksheets(y).Range("B" & 48 + dimen3).Value
                    Next dimen3
                Next dimen2
            Next dimen1
        End If
    Next y
End With

Данные:
Диапазон ("B7"): строка или целое число
Диапазон ("B8"): двойной
Диапазон (" B48: B "& i): Dynami c Строка Range

Ни один из других ответов не дал мне ясности. Может кто-нибудь подсказать, почему я получаю ошибку?

1 Ответ

1 голос
/ 18 марта 2020

Вы измерили массив вариантов в 3 измерениях.

Две строки, которые дают вам ошибки, потому что вы пытаетесь присвоить значение элементу массива без указания трех индексов.

Вы ДОЛЖНЫ ВСЕГДА использовать в массиве одинаковое количество индексов, поскольку массив имеет измерения. Без исключений, никогда. В VBA нет способа узнать, к какому элементу вы пытаетесь обратиться в противном случае.

Массив в 3 измерениях концептуально является кубом. Но то, что вы сделали, объявив первое и второе измерения как нулевого размера, фактически стало сложным для работы вектором.

В вашем массиве есть только rng элементов, и к этим элементам можно получить доступ только предоставляя все три индекса. Например, первый элемент - hArr(0, 0, 0). Второй элемент - hArr(0, 0, 1). Третий элемент - hArr(0, 0, 2). Et c.

В вашей схеме объявления первого и второго измерений как нулевого размера, вы фактически потратили впустую первые два измерения. У вас есть массив 1d, для которого теперь требуется три индекса для ссылки на каждый элемент.


Обновление

Для структуры массива с зубчатыми краями учитывайте следующее.

Dim t

Redim t(1 to 3)

t(1) = "Unique Value 1"
t(2) = "Unique Value 2"
t(3) = Array(1, 2, 3, "Some other value")

Обратите внимание, что здесь я назначил массив 1d для t(3), но это мог быть массив 2d или массив любого ранга.

Чтобы получить значения, вы делаете это следующим образом ...

Debug.Print t(1)
Debug.Print t(2)
Debug.Print t(3)(0)
Debug.Print t(3)(1)
Debug.Print t(3)(2)
Debug.Print t(3)(3)

Каждый элемент в массиве вариантов может потенциально содержать отдельный массив. И каждый элемент в этих отдельных массивах может содержать новые массивы. И так далее. Столь сложные структуры данных возможны и допустимы при таком подходе.

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