Определение координат выбранного элемента двумерного массива из кода VBA Excel при обходе его элементов циклом For Each… Next. Адрес исходной ячейки.
Определение координат элемента массива
Определение координат выбранного элемента двумерного массива внутри цикла For Each… Next. Под координатами следует понимать индексы первого и второго измерений массива.
Изображение рабочего листа с заполненным диапазоном для примеров определения координат элемента массива по его значению и адреса соответствующей ячейки:
Код VBA Excel для определения координат элемента двумерного массива по его значению внутри цикла For Each… Next:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub Primer1() Dim myRange, myArr(), el, ub, n, in1, in2 Set myRange = Range("B3:G7") 'присваиваем массиву значения указанного диапазона myArr = myRange.Value 'определяем верхнюю границу первого измерения массива ub = UBound(myArr) For Each el In myArr If el = 17 Then 'вычисляем индекс первого измерения in1 = (n Mod ub) + 1 'вычисляем индекс второго измерения in2 = (n \ ub) + 1 'отображаем результаты в окне Immediate Debug.Print "Индекс первого измерения: " & in1 'Результат: 3 Debug.Print "Индекс второго измерения: " & in2 'Результат: 5 Exit For End If n = n + 1 Next End Sub |
Координаты элемента массива myArr
(ячейки диапазона Range("B3:G7")
) со значением 17:
- индекс первого измерения (строка) — 3;
- индекс второго измерения (столбец) — 5.
Определение адреса исходной ячейки
Определение адреса исходной ячейки, соответствующей элементу двумерного массива, созданного присвоением массиву значений заданного диапазона рабочего листа.
Код VBA Excel для определения адреса исходной ячейки по найденному элементу двумерного массива внутри цикла For Each… Next:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub Primer2() Dim myRange, myArr(), el, ub, n, addr Set myRange = Range("B3:G7") myArr = myRange.Value ub = UBound(myArr) For Each el In myArr If el = 17 Then 'определяем адрес ячейки, соответствующей элементу массива addr = myRange((n Mod ub) + 1, (n \ ub) + 1).Address 'отображаем результат в окне Immediate Debug.Print "Адрес ячейки: " & addr 'Результат: $F$5 Exit For End If n = n + 1 Next End Sub |
Внутри диапазона myRange индексация ячеек соответствует индексации элементов массива myArr. Но обход элементов массива циклом For Each… Next, если смотреть на диапазон, откуда скопированы значения, почему-то идет сверху вниз — слева направо, то есть по столбцам. В диапазоне порядок обхода ячеек соответствует их индексам. Проверьте сами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'Обход ячеек диапазона Sub Test1() Dim el For Each el In Range("B3:G7") Debug.Print el Next End Sub 'Обход элементов массива Sub Test2() Dim myArr(), el myArr = Range("B3:G7").Value For Each el In myArr Debug.Print el Next End Sub |