TOP
VBA-Урок 13.2. Использование массивов (Arrays) (Продолжение)
Для того, чтобы сохранить более одного столбца данных, нам необходима другая размерность массива. например:
Сохранение данных в двумерный массив:
-
- Dim array_example (10, 2)
-
-
- For i = 0 To 10
- array_example(i, 0) = Range("A" & i + 2)
- array_example(i, 1) = Range("B" & i + 2)
- array_example(i, 2) = Range("C" & i + 2)
- Next
'Декларирование
Dim array_example (10, 2) '11 x 3 "определенный" массив
'Сохранение данных в массиве
For i = 0 To 10
array_example(i, 0) = Range("A" & i + 2)
array_example(i, 1) = Range("B" & i + 2)
array_example(i, 2) = Range("C" & i + 2)
Next
Далее есть несколько примеров работы с этими значениями:
- MsgBox array_example (0, 0)
- MsgBox array_example (0, 1)
- MsgBox array_example (9, 2)
- MsgBox array_example (10, 2)
MsgBox array_example (0, 0) '=> возвращает: 03.11.2026
MsgBox array_example (0, 1) '=> возвращает: 24
MsgBox array_example (9, 2) '=> возвращает: NO
MsgBox array_example (10, 2) '=> возвращает: YES
Динамический массив
Давайте представим на минутку, что нам нужно обновлять данные в нашем массиве на регулярной основе, и поэтому мы не можем присвоить фиксированные значения при декларировании ...
Чтобы узнать номер строки последней непустой ячейки, или другими словами, последнюю строку нашей базы данных, мы используем следующую формулу:
- last_row = Range("A1").End(xlDown).Row
last_row = Range("A1").End(xlDown).Row
Excel не принимает переменные в декларации.
Вместо этого, задекларируем динамический массив (используя пустые скобки), затем определим его размер используя Redim:
- Dim array_example ()
- ReDim array_example (last_row - 2, 2)
Dim array_example ()
ReDim array_example (last_row - 2, 2)
Используя следующую процедуру, вы можете сохранить все строки вашего набора данных (таблицы) в нашем массиве:
- Dim array_example()
- ReDim array_example(last_row - 2, 2)
Dim array_example()
ReDim array_example(last_row - 2, 2)
Ubound
В предыдущем примере, последний номер в нашем массиве был last_row - 2:
- For i = 0 To last_row - 2
For i = 0 To last_row - 2
Другой способ, чтобы определить последний номер в нашем массиве, мог бы быть через использование Ubound :
- For i = 0 To UBound (array_example)
For i = 0 To UBound (array_example)
Эта функция возвращает наибольший номер в массиве для выбранного измерения (первое измерение есть по-умолчанию).
Далее есть несколько примеров, которые прояснят это подробнее:
- Sub example()
- Dim array_example(10, 2)
-
- MsgBox UBound (array_example)
- MsgBox UBound (array_example, 1)
- MsgBox UBound (array_example, 2)
- End Sub
Sub example()
Dim array_example(10, 2)
MsgBox UBound (array_example) '=> возвращает: 10
MsgBox UBound (array_example, 1) '=> возвращает: 10
MsgBox UBound (array_example, 2) '=> возвращает : 2
End Sub
Сохранение данных в диапазоне элементов массива
Есть возможным заполнить массив значениями из диапазона ячеек на рабочем листе даже без использования цикла:
-
- Dim array_example (10, 2)
-
-
- For i = 0 To 10
- array_example(i, 0) = Range("A" & i + 2)
- array_example(i, 1) = Range("B" & i + 2)
- array_example(i, 2) = Range("C" & i + 2)
- Next
'Декларирование
Dim array_example (10, 2) '11 x 3 "определенный" массив
'Сохранение данных в массиве
For i = 0 To 10
array_example(i, 0) = Range("A" & i + 2)
array_example(i, 1) = Range("B" & i + 2)
array_example(i, 2) = Range("C" & i + 2)
Next
Предыдущий код может быть эффективно заменен этим:
-
- Dim array_example ()
-
-
- array_example = Range("A2:C12").Value
'Декларирование
Dim array_example ()
'Сохранение данных в массиве
array_example = Range("A2:C12").Value
Хотя второй метод кажется более привлекательным, чем первый, будьте осторожны, что в большинстве случаев он может вам стоить больше времени на выполнение, чем первый.
Если вы сохраните данные в вашем массиве таким способом, первый номер будет 1, а не 0, что может привести к недоразумению ...
Далее в процессе увеличения кода, если вы решите сохранить только данные, которые соответствуют определенным критериям поиска в массиве (или проводить совсем другую операции), вам придется полностью переписать код, используя другую функцию цикла ...
Но этот второй метод является весьма полезным, если вам нужно сохранить все содержимое большого набора данных, потому что это быстрее, чем циклом (экономит примерно 0,2 секунд на каждые 15 000 записей).
Массив (Array)
Но если вам нужно создать массив, который имеет "фиксированное" содержание.
Одним из решений могло бы быть прописать значение строчка за строчкой:
- Dim en(5)
-
- en(0) = "IF"
- en(1) = "VLOOKUP"
- en(2) = "SUM"
- en(3) = "COUNT"
- en(4) = "ISNUMBER"
- en(5) = "MID"
Dim en(5)
en(0) = "IF"
en(1) = "VLOOKUP"
en(2) = "SUM"
en(3) = "COUNT"
en(4) = "ISNUMBER"
en(5) = "MID"
К счастью, вы можете упростить этот код, используя массив ( Array ):
- en = Array ("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
en = Array ("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
Вот демонстрация использования функции Replace (это поможет вам понять следующий пример):
- Sub replace_example()
- Dim var_translate As String
-
-
- var_translate = "Hello World!"
-
-
- var_translate = Replace (var_translate, "World", "you")
-
-
- MsgBox var_translate
- End Sub
Sub replace_example()
Dim var_translate As String
'Текстовая строчка для этого примера
var_translate = "Hello World!"
'Замена "World" на "you" в текстовой строке
var_translate = Replace (var_translate, "World", "you")
'Строка после замены
MsgBox var_translate '=> возвращает "Hello you!"
End Sub
Теперь, если мы хотим заменить ряд значений другим набором данных, использование массивов и Array функции будет чрезвычайно полезным:
- Sub translate ()
- Dim var_translate As String
-
-
- var_translate = "Formula to translate: SUM (IF (ISNUMBER (A1: E1), A1: E1,0))"
-
-
- en = Array ("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
- fr = Array ("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")
-
-
- For i = 0 To UBound (en)
- var_translate = Replace (var_translate, en (i), fr (i))
- Next
-
-
- MsgBox var_translate
- End Sub
Sub translate () 'Упрощенный пример перевода формул с английского на французский
Dim var_translate As String
'Текстовая строчка для этого примера
var_translate = "Formula to translate: SUM (IF (ISNUMBER (A1: E1), A1: E1,0))"
'Два набора значений
en = Array ("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
fr = Array ("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")
'Замена" SI "на" IF "," RECHERVEV "на" VLOOKUP "и т.д.
For i = 0 To UBound (en)
var_translate = Replace (var_translate, en (i), fr (i))
Next
'Строка после замены
MsgBox var_translate '=> возвращает "Formula to translate : SOMME(SI(ESTNUM(A1:E1),A1:E1,0))"
End Sub
Разделение (Split)
Функция Split позволяет нам превратить символьную строку в массив.
Чтобы превратить строку в массив, сделайте следующее:
- variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"
variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"
Используйте функцию Split и укажите разделитель:
- en = Split (variable, "/")
en = Split (variable, "/")
Массив en вернет следующие значения:
- MsgBox en(0)
- MsgBox en (1)
- MsgBox en (2)
- MsgBox en (3)
- MsgBox en (4)
- MsgBox en (5)
MsgBox en(0) '=> возвращает: IF
MsgBox en (1) '=> возвращает: VLOOKUP
MsgBox en (2) '=> возвращает: SUM
MsgBox en (3) '=> возвращает: COUNT
MsgBox en (4) '=> возвращает: ISNUMBER
MsgBox en (5) '=> возвращает: MID
Следующие 3 массивы также вернут те же значения:
- en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
- en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")
- en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")
en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")
en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")
Следующий пример возвращает третье значение в строке:
- MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2)
MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> возвращает : SUM
Обратной к Split является функция Join .
Эта функция собирает значение массива в строку.
- MsgBox Join (Array (1, 2, 3, 4, 5), "")
MsgBox Join (Array (1, 2, 3, 4, 5), "") '=> возвращает: 12345
Статьи по теме:
VBA-Урок 13.1. Использование массивов (Arrays)
VBA-Урок 13.3. Использование массивов (Arrays) (Упражнения)