Страницы: 1
RSS
Определить верхнюю границу массива.
 
Здравствуйте. Есть такой массив:
Код
    For b = 1 To 2
        
            Select Case b
                 Case 1
                      rnge = "A1:A30"
                 Case 2
                      rnge = "B1:B30"
            End Select
            
            q(b) = Range(rnge).Value
    Next b

Получаем:

q(1)(1,1) = значение 1
q(1)(1,2) = значение 2
...
q(1)(1,30) = значение 30

q(2)(1,1) = значение 1
q(2)(1,2) = значение 2
...
q(2)(1,30) = значение 30

Вопрос: как получить верхнюю границу массива? Ubound(q) выведет 2, а нужно 30. Не могу правильно записать функцию Ubound и какой это массив - трехмерный?

msgbox ubound(q.....)?
 
Рано задал вопрос на форуме, ответ простой: msgbox ubound (q(1)) или ubound(q(2)) - если размер диапазонов одинаковый, либо циклом, если разный.

Остался другой вопрос: это трехмерный массив или все еще двухмерный, подскажите?  
Изменено: НСС - 28.03.2024 22:04:25
 
НСС, Какой из массивов? У вас 3 отдельных массива, только один из них содержит в качестве элементов другие массивы чтоб лучше понять макрос нужно изменить

Код
For b = 1 To 2
             Select Case b
                 Case 1
                      rnge = "A1:A30"
                 Case 2
                      rnge = "B1:B20"
            End Select
            
            q(b) = Range(rnge).Value
    Next b


ну и как следствие обращение будет q(1)(5,1) как пример, а не  q(1,5,1)
По вопросам из тем форума, личку не читаю.
 
Цитата
НСС написал:
получить верхнюю границу массива
Одна из возможностей:
Код
Option Explicit

Sub aaa_2()
    Dim dL1, dH1, dL2, dH2, i&, j&, k&, q, r
    
    r = Array("A1:A30", "B1:B30", "C3")
    
    For i = LBound(r) To UBound(r)
        q = Range(r(i)).Value
        
        If IsArray(q) Then
            Debug.Print "Arr r#" & i, "rng = " & r(i)
            dL1 = LBound(q, 1): Debug.Print "Low indx of 1st dim " & dL1
            dH1 = UBound(q, 1): Debug.Print "Upr indx of 1st dim " & dH1
            dL2 = LBound(q, 2): Debug.Print "Low indx of 2nd dim " & dL2
            dH2 = UBound(q, 2): Debug.Print "Upr indx of 2nd dim " & dH2
            
            For k = dL1 To dH2
                For j = dL1 To dH1
                    Debug.Print "Elmt #(" & j & "," & k & ") = " & q(j, k)
                Next
            Next
            Debug.Print "---------"
        End If
    Next
End Sub
Это всегда будет двумерный массив.
 
НСС, Здравствуйте
Цитата
НСС: Рано задал вопрос на форуме, ответ простой: msgbox ubound (q(1)) или ubound(q(2)) - если размер диапазонов одинаковый, либо циклом, если разный.
вообще не факт.
если в массиве q(1 To 2) 2 элемента, каждый из которых это двумерный массив a(1 To 30, 1 To 1), то правильнее обращаться по полному адресу:
LBound(a, 1) вернёт нижнюю границу 1ой размерности. Для массива с листа это всегда 1 (как и для нижней границы 2ой размерности).
UBound(a, 1) вернёт верхнюю границу 1ой размерности, то есть количество "строк" в массиве.
UBound(a, 2) вернёт верхнюю границу 2ой размерности, то есть количество "столбцов" в массиве.

Таким образом, правильнее вычислять верхнюю границу вложенного двумерного массива так: ubound (q(1), 1) или ubound (q(1), 2).
Замените q(1) на его содержимое (2D-Массив) и получите ubound (a, 1) и ubound (a, 2) , как описано выше.

Разумеется, никакого цикла для вашего случая не нужно. Размер массива хранится "где-то там" и получить его можно мгновенно.

Цитата
НСС: Остался другой вопрос: это трехмерный массив или все еще двухмерный, подскажите?
ни то, ни другое. Это одномерный массив из двумерных массивов. Размерность массива определяется по количеству элементов, разделённых запятыми, при доступе к конкретному элементу массива. Так, массив a(10) — одномерный, a(10, 10) — двухмерный, a(10, 10, 10) — трёхмерный. И так далее. Общее количество элементов, которые можно засунуть в массив является произведением количества элементов каждой размерности. Если нижняя граница — 0, то можно упростить до произведения верхних границ каждой размерности.

Аккуратнее с массивами  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Если нижняя граница — 0, то можно упростить до произведения верхних границ каждой размерности
Неправда Ваша :)
В массиве А(0, 0)  1 элемент, а не 0.
Изменено: Апострофф - 30.03.2024 18:15:31
Страницы: 1
Наверх