Оглавление
- Массивы в Visual Basic for Application
- Array Methods
- Задание нижней границы по-умолчанию
- Редактирование формул массива в Excel
- Описание функции InStr
- Функция ВПР
- Set Array Values
- Примеры циклов For Each… Next
- Multi-Dimensional Array Examples
- Задание нижней границы по-умолчанию
- Динамические массивы
- Двумерные массивы
- Массивы
- Чтение из диапазона ячеек в массив
- Компоненты цикла For Each… Next
Массивы в Visual Basic for Application
Массивы в Visual Basic for Application – это структуры, которые обычно хранят наборы взаимосвязанных переменных одного типа. Доступ к записям массива осуществляется по их числовому индексу.
Например, есть команда из 20 человек, имена которых нужно сохранить для дальнейшего использования в коде VBA. Можно было бы просто объявить 20 переменных для хранения каждого имени, вот так:
Но можно использовать гораздо более простой и организованный способ – сохранить список имён членов команды в массиве из 20 переменных типа String:
В строке, показанной выше, мы объявили массив. Теперь запишем значение в каждый из его элементов, вот таким образом:
Дополнительное преимущество хранения данных в массиве, по сравнению с использованием отдельных переменных, становится очевидным, когда возникает необходимость выполнить одно и то же действие над каждым элементом массива. Если бы имена членов команды были сохранены в 20 отдельных переменных, то потребовалось бы каждый раз записывать 20 строк кода, чтобы выполнить одинаковое действие с каждым из них. Однако, если имена сохранены в массиве, то выполнить нужное действие с каждым из них можно при помощи простого цикла.
Как это работает продемонстрировано ниже на примере кода, который выводит имена каждого члена команды последовательно в ячейки столбца A активного рабочего листа Excel.
Очевидно, что работа с массивом, в котором сохранено 20 имён, значительно менее громоздка и более аккуратна, чем использование 20 отдельных переменных. А что, если этих имён не 20, а 1000? А если, вдобавок, требуется сохранить отдельно фамилии и отчества?! Ясно, что вскоре станет совершенно невозможно справиться с таким объёмом данных в коде VBA без помощи массива.
Array Methods
There are various inbuilt functions within VBScript which help the developers to handle arrays effectively. All the methods that are used in conjunction with arrays are listed below. Please click on the method name to know about it in detail.
Sr.No. | Function & Description |
---|---|
1 |
LBound
A Function, which returns an integer that corresponds to the smallest subscript of the given arrays. |
2 |
UBound
A Function, which returns an integer that corresponds to the largest subscript of the given arrays. |
3 |
Split
A Function, which returns an array that contains a specified number of values. Split based on a delimiter. |
4 |
Join
A Function, which returns a string that contains a specified number of substrings in an array. This is an exact opposite function of Split Method. |
5 |
Filter
A Function, which returns a zero based array that contains a subset of a string array based on a specific filter criteria. |
6 |
IsArray
A Function, which returns a boolean value that indicates whether or not the input variable is an array. |
7 |
Erase
A Function, which recovers the allocated memory for the array variables. |
Previous Page
Print Page
Next Page
Задание нижней границы по-умолчанию
Иногда бывает очень не удобно, что VBA начинает нумерацию элементов массивов с нуля (0), это часто может привести к путанице и усложнению кода программы. Для решения этой проблемы есть специальный оператор Option Base , аргумент которого может быть 0 или 1. Указав значение 1, индексация массивов будет начинаться с 1, а не с 0.
Пример 6. Указание нижней границы по-умолчанию.
В данном примере я намеренно использовал процедуру, чтобы показать, что Option Base нужно применять не внутри процедур и функций, а в разделе «Declarations». В результате выполнения процедуры Test будет отображено сообщение с индексом нижней границы массива, т.е. «1».
Примечание: Оператор Option Base так же влияет на функцию Array и не влияет на функцию Split (будут рассмотрены ниже), что означает, что при задании «Option Base 1», функция Array вернет массив с индексацией с 1-цы, а функция Split вернет массив с индексацией с 0.
Редактирование формул массива в Excel
Правила редактирования формул массива
получили только одно они не должны используя ключевое слово показано в одном VBA без помощи Excel. Несколько способов к 6+2. Затем, нажимая. Массив – это
- Вводная статья для тех,. Для этого выберите разобрали основные понятия принимающий ссылку на если бы купил
- вопросов. для выполнения последующих сумму всех элементов значение, соответствующее первому
- быть введены вручную,Preserve из примеров, при массива.
- мы рассмотрели в получившиеся суммы сложит.CTRL+SHIFT+ENTER просто набор неких
- кто никогда не любую ячейку массива и сведения касаемо один или несколько 2 л молокаФункция ИНДЕКС в Excel
действий? Ничего сложного! в таблице. В значению в таблице. а только лишь, можно изменить размер объявлении двумерного массиваМассивы Visual Basic, о статье «Сумма в Получится результат =. Эти формулы вводятся
Выделение массива в Excel
элементов (значений). использовал формулы массива. и нажмите комбинацию. массивов в Excel. диапазонов ячеек. Ссылки и 4 кг возвращает данные из Пример 1: нашем примере сумма
- Однако достаточно ввести при помощи комбинации только последнего измерения индексы его измерений которых шла речь Excel».
-
33. только в ячейкиТ.е. обычная функция СУММ()Без формул массива (arrayСамое простое, что Вы В этом уроке на два и яблок на основании таблицы или определенногоПерейдите на ячейку с равна 45. В формулу массива в
клавиш CTRL+SHIFT+Enter. Если массива. разделяются запятой: выше, считаются одномерными.Массивы в Visual BasicКорректировка формулы массива в листа. Однако, если
в качестве аргумента
- formulas) можно обойтись, можете сделать с мы продолжим изучение более несмежных диапазона данных, содержащихся в
Как удалить формулу массива
диапазона ячеек на формулой, а затем завершении, посмотрите, что диапазон ячеек, чтобы ввести вручную фигурныеУрок подготовлен для ВасDim Jan_Sales_Figures(1 To Это означает, что for Application –Excel
Как отредактировать формулу массива
формуле массива присвоить получила некий массив т.к. это просто массивом в Excel формул массива, но должны быть заключены таблице к первому основе известных строки в строке формул
произойдет, если вы увидеть все значения
Изменение размеров формулы массива
обычно хранят наборыКорректируем формулу массива, «сообразит», что нужно на него). однотипных формул. Однако, его. Для этого на их практическое функция с аргументамиВид таблиц данных: которых передаются в
аргументе функции ссылку приведенную выше формулу этого выделяем диапазон в массиве –Перевел: Антон АндроновОднако, если не указывать массивы могут иметь взаимосвязанных переменных одного как обычную формулу,
с ней нужноТеперь проведем тот у формул массива достаточно выделить нужный применение. Итак, как ((A1:B4;D4:E9);2;2;1), принимающая ссылку
Для расчетов используем следующую качестве аргументов функции. на диапазон ячеек: не как формулу из нескольких ячеек,
- на несмежные диапазоны формулу:
- Существует два варианта даннойНажмите клавишу F9 (или
- массива. нажимаем клавишу F2
- ошибка в Excel.
- Как узнать, является ли обоих измерений массива
- двумерный массив можно записям массива осуществляется
ввода нажимаем НЕ формуле =СУММ($A$2:$A$12^2) присвоить формулой массива:
одна такая формула
office-guru.ru>
Описание функции InStr
InStr – это функция, которая предназначена для определения номера позиции первого вхождения одной строки в другую. Она возвращает значение типа Variant (Long).
Функция InStr ищет первое вхождение одной строки в другую с начала исходной строки. Для поиска первого совпадения с конца исходной строки используется функция InStrRev.
Функция InStr часто незаменима при определении параметров функций Left, Mid и Right. Также ее можно использовать для определения наличия искомой подстроки в заданной строке.
Еще есть в VBA Excel функция InStrB, которая работает с байтовыми данными, содержащимися в строке. Она возвращает позицию байта, а не символа первого вхождения одной строки в другую. Смотрите ниже Пример 3.
Функция ВПР
Вертикальное первое равенство. Ищет совпадение по ключу в первом столбце определенного диапазона и возвращает значение из указанного столбца этого диапазона в совпавшей с ключом строке.
Синтаксис: =ВПР(ключ; диапазон; номер_столбца; ), где
- ключ – обязательный аргумент. Искомое значение, для которого необходимо вернуть значение.
- диапазон – обязательный аргумент. Таблица, в которой необходимо найти значение по ключу. Первый столбец таблицы (диапазона) должен содержать значение совпадающее с ключом, иначе будет возвращена ошибка #Н/Д.
- номер_столбца – обязательный аргумент. Порядковый номер столбца в указанном диапазоне из которого необходимо возвратить значение в случае совпадения ключа.
-
интервальный_просмотр – необязательный аргумент. Логическое значение указывающее тип просмотра:
- ЛОЖЬ – функция ищет точное совпадение по первому столбцу таблицы. Если возможно несколько совпадений, то возвращено будет самое первое. Если совпадение не найдено, то функция возвращает ошибку #Н/Д.
- ИСТИНА – функция ищет приблизительное совпадение. Является значением по умолчанию. Приблизительное совпадение означает, если не было найдено ни одного совпадения, то функция вернет значение предыдущего ключа. При этом предыдущим будет считаться тот ключ, который идет перед искомым согласно сортировке от меньшего к большему либо от А до Я. Поэтому, перед применением функции с данным интервальным просмотром, предварительно отсортируйте первый столбец таблицы по возрастанию, так как, если это не сделать, функция может вернуть неправильный результат. Когда найдено несколько совпадений, возвращается последнее из них.
Важно не путать, что номер столбца указывается не по индексу на листе, а по порядку в указанном диапазоне. Пример использования:. Пример использования:
Пример использования:
На изображении приведено 3 таблицы. Первая и вторая таблицы располагают исходными данными. Третья таблица собрана из первых двух.В первой таблице приведены категории товара и расположение каждой категории.Во второй категории имеется список всех товаров с указанием цен.Третья таблица содержать часть товаров для которых необходимо определить цену и расположение.
Для цены необходимо использовать функцию ВПР с точным совпадением (интервальный просмотр ЛОЖЬ), так как данный параметр определен для всех товаров и не предусматривает использование цены другого товара, если вдруг она по случайности еще не определена.
Для определения расположения товара используется ВПР с приблизительным совпадением (интервальный просмотр ИСТИНА), так как распределение товара осуществляется по категориям. Из-за того, что наименование товара состоит из названия категории плюс дополнительный текст, по условиям сортировки от А до Я наименования товаров будут идти сразу после наименования категории, поэтому когда в таблице не обнаруживается совпадений с ключом подтягивается первое значение сверху.
В принципе, данный подход устраивал бы, если для товаров, для которых отсутствует категория, не подтягивалось расположение
Обратите внимание на товар «Лук Подмосковье». Для него определено расположение «Стелаж №2», хотя в первой таблице нет категории «Лук». Это происходит все по тем же причинам, когда функцией не обнаруживается равенств, то она определяет для значения значение меньшего самого близкого по сортировке ключа, а для «Лук Подмосковье» это категория «Картофель»
Это происходит все по тем же причинам, когда функцией не обнаруживается равенств, то она определяет для значения значение меньшего самого близкого по сортировке ключа, а для «Лук Подмосковье» это категория «Картофель».
Он подобного эффекта можно избавиться путем определения категории из наименования товара используя текстовые функции ЛЕВСИМВ(C11;ПОИСК(» «;C11)-1), которые вернут все символы до первого пробела, а также изменить интервальный просмотр на точный.
Помимо всего описанного, функция ВПР позволяет применять для текстовых значений подстановочные символы – * (звездочка – любое количество любых символов) и ? (один любой символ). Например, для искомого значения «*» & «иван» & «*» могут подойти строки Иван, Иванов, диван и т.д.
Также данная функция может искать значения в массивах – =ВПР(1;{2;»Два»:1;»Один»};2;ЛОЖЬ) – результат выполнения строка «Два».
Set Array Values
Setting array values is very easy.
With a static array, you must define each position of the array, one at a time:
1 |
SubArrayExample() DimstrNames(1to4)asString strNames(1)=»Shelly» strNames(2)=»Steve» strNames(3)=»Neema» strNames(4)=»Jose» EndSub |
With a Variant Array you can define the entire array with one line (only practical for small arrays):
1 |
SubArrayExample_1Line() DimstrNames()AsVariant strNames=Array(«Shelly»,»Steve»,»Neema»,»Jose») EndSub |
If you attempt to define a value for an array location that does not exist, you will receive a Subscript Out of Range error:
1 | strNames(5)=»Shannon» |
In the ‘Assign Range to Array’ section Below we’ll show you how to use a loop to quickly assign large numbers of values to arrays.
Get Array Value
You can fetch array values the same way. In the example below we will write array values to cells:
1 |
Range(«A1»).Value=strNames(1) Range(«A2»).Value=strNames(2) Range(«A3»).Value=strNames(3) Range(«A4»).Value=strNames(4) |
Примеры циклов For Each… Next
Цикл для диапазона ячеек
На активном листе рабочей книги Excel выделите диапазон ячеек и запустите на выполнение следующую процедуру:
1 |
Subtest1() Dimelement AsRange,aAsString a=»Данные, полученные с помощью цикла For Each… Next:» ForEachelement InSelection a=a&vbNewLine&»Ячейка «&element.Address&_ » содержит значение: «&CStr(element.Value) Next MsgBoxa EndSub |
Информационное окно MsgBox выведет адреса выделенных ячеек и их содержимое, если оно есть. Если будет выбрано много ячеек, то полностью информация по всем ячейкам выведена не будет, так как максимальная длина параметра Prompt функции MsgBox составляет примерно 1024 знака.
Цикл для коллекции листов
Скопируйте следующую процедуру VBA в стандартный модуль книги Excel:
1 |
Subtest2() Dimelement AsWorksheet,aAsString a=»Список листов, содержащихся в этой книге:» ForEachelement InWorksheets a=a&vbNewLine&element.Index_ &») «&element.Name Next MsgBoxa EndSub |
Информационное окно MsgBox выведет список наименований всех листов рабочей книги Excel по порядковому номеру их ярлычков, соответствующих их индексам.
Цикл для массива
Присвоим массиву список наименований животных и в цикле For Each… Next запишем их в переменную a. Информационное окно MsgBox выведет список наименований животных из переменной a.
1 |
Subtest3() Dimelement AsVariant,aAsString,group AsVariant group=Array(«бегемот»,»слон»,»кенгуру»,»тигр»,»мышь») ‘или можно присвоить массиву значения диапазона ячеек a=»Массив содержит следующие значения:»&vbNewLine ForEachelement Ingroup a=a&vbNewLine&element Next MsgBoxa EndSub |
Повторим ту же процедуру VBA, но всем элементам массива в цикле For Each… Next присвоим значение «Попугай». Информационное окно MsgBox выведет список наименований животных, состоящий только из попугаев, что доказывает возможность редактирования значений элементов массива в цикле For Each… Next.
1 |
Subtest4() Dimelement AsVariant,aAsString,group AsVariant group=Array(«бегемот»,»слон»,»кенгуру»,»тигр»,»мышь») ‘или можно присвоить массиву значения диапазона ячеек a=»Массив содержит следующие значения:»&vbNewLine ForEachelement Ingroup element=»Попугай» a=a&vbNewLine&element Next MsgBoxa EndSub |
Этот код, как и все остальные в этой статье, тестировался в Excel 2016.
Multi-Dimensional Array Examples
Now let’s demonstrate examples of working with arrays of different dimensions.
1D Array Example
This procedure combines the previous array examples into one procedure, demonstrating how you might use arrays in practice.
1 |
SubArrayEx_1d() DimstrNames(1To60000)AsString DimiAsLong ‘Assign Values to Array Fori=1To60000 strNames(i)=Cells(i,1).Value Nexti ‘Output Array Values to Range Fori=1To60000 Sheets(«Output»).Cells(i,1).Value=strNames(i) Nexti EndSub |
2D Array Example
This procedure contains an example of a 2D array:
1 |
SubArrayEx_2d() DimstrNames(1To60000,1To10)AsString DimiAsLong,jAsLong ‘Assign Values to Array Fori=1To60000 Forj=1To10 strNames(i,j)=Cells(i,j).Value Nextj Nexti ‘Output Array Values to Range Fori=1To60000 Forj=1To10 Sheets(«Output»).Cells(i,j).Value=strNames(i,j) Nextj Nexti EndSub |
3D Array Example
This procedure contains an example of a 3D array for working with multiple sheets:
1 |
SubArrayEx_3d() DimstrNames(1To60000,1To10,1To3)AsString DimiAsLong,jAsLong,kAsLong ‘Assign Values to Array Fork=1To3 Fori=1To60000 Forj=1To10 strNames(i,j,k)=Sheets(«Sheet»&k).Cells(i,j).Value Nextj Nexti Nextk ‘Output Array Values to Range Fork=1To3 Fori=1To60000 Forj=1To10 Sheets(«Output»&k).Cells(i,j).Value=strNames(i,j,k) Nextj Nexti Nextk EndSub |
Задание нижней границы по-умолчанию
Иногда бывает очень не удобно, что VBA начинает нумерацию элементов массивов с нуля (0), это часто может привести к путанице и усложнению кода программы. Для решения этой проблемы есть специальный оператор Option Base , аргумент которого может быть 0 или 1. Указав значение 1, индексация массивов будет начинаться с 1, а не с 0.
Пример 6. Указание нижней границы по-умолчанию.
В данном примере я намеренно использовал процедуру, чтобы показать, что Option Base нужно применять не внутри процедур и функций, а в разделе “Declarations”. В результате выполнения процедуры Test будет отображено сообщение с индексом нижней границы массива, т.е. “1”.
Примечание: Оператор Option Base так же влияет на функцию Array и не влияет на функцию Split (будут рассмотрены ниже), что означает, что при задании “Option Base 1”, функция Array вернет массив с индексацией с 1-цы, а функция Split вернет массив с индексацией с 0.
Динамические массивы
Динамические массивы в VBA Excel, в отличие от статических, объявляются без указания размерности:
Такие массивы используются, когда заранее неизвестна размерность, которая определяется в процессе выполнения программы. Когда нужная размерность массива становится известна, она в VBA Excel переопределяется с помощью оператора ReDim:
Переопределять размерность динамических массивов в процессе работы программы можно неоднократно, как по количеству измерений, так и по количеству элементов в измерении.
С помощью оператора ReDim невозможно изменить обычный массив, объявленный с заранее заданной размерностью. Попытка переопределить размерность такого массива вызовет ошибку компиляции с сообщением: Array already dimensioned (Массив уже измерен).
При переопределении размерности динамических массивов в VBA Excel теряются значения их элементов. Чтобы сохранить значения, используйте оператор Preserve:
Обратите внимание!Переопределить с оператором Preserve можно только последнюю размерность динамического массива. Это недоработка разработчиков, которая сохранилась и в VBA Excel 2016
Без оператора Preserve можно переопределить все размерности.
Двумерные массивы
Массивы, на которые мы смотрели до сих пор, были одномерными. Это означает, что массивы представляют собой один список элементов.
Двумерный массив — это список списков. Если вы думаете об одной строке электронной таблицы как об одном измерении, то более одного столбца является двухмерным. На самом деле электронная таблица является эквивалентом двумерного массива. Он имеет два измерения — строки и столбцы.
Следует отметить одну маленькую вещь: Excel обрабатывает одномерный массив как строку, если вы записываете его в электронную таблицу. Другими словами, массив arr (от 1 до 5) эквивалентен arr (от 1 до 1, от 1 до 5) при записи значений в электронную таблицу.
На следующем рисунке показаны две группы данных. Первый — это одномерный массив, а второй — двухмерный.
Чтобы получить доступ к элементу в первом наборе данных (одномерном), все, что вам нужно сделать, это дать строку, например. 1,2, 3 или 4.
Для второго набора данных (двумерного) вам нужно указать строку И столбец. Таким образом, вы можете думать, что 1-мерное — это несколько столбцов, а одна строка и двухмерное — это несколько строк и несколько столбцов.
Примечание. В массиве может быть более двух измерений. Это редко требуется. Если вы решаете проблему с помощью 3+-мерного массива, то, вероятно, есть лучший способ сделать это.
Вы объявляете двумерный массив следующим образом:
Dim ArrayMarks(0 To 2, 0 To 3) As Long
В следующем примере создается случайное значение для каждого элемента в массиве и печатается значение в Immediate Window.
Public Sub TwoDimArray() ' Объявить двумерный массив Dim arrMarks(0 To 3, 0 To 2) As String ' Заполните массив текстом, состоящим из значений i и j Dim i As Long, j As Long For i = LBound(arrMarks) To UBound(arrMarks) For j = LBound(arrMarks, 2) To UBound(arrMarks, 2) arrMarks(i, j) = CStr(i) & ":" & CStr(j) Next j Next i ' Вывести значения в массиве в Immediate Window Debug.Print "i", "j", "Знаечние" For i = LBound(arrMarks) To UBound(arrMarks) For j = LBound(arrMarks, 2) To UBound(arrMarks, 2) Debug.Print i, j, arrMarks(i, j) Next j Next i End Sub
Видите, что мы используем второй цикл For внутри первого цикла, чтобы получить доступ ко всем элементам.
Результат примера выглядит следующим образом:
Этот макрос работает следующим образом:
- Входит в цикл i
- i установлен на 0
- цикл Enters j
- j установлен на 0
- j установлен в 1
- j установлен на 2
- Выход из цикла j
- i установлен в 1
- j установлен на 0
- j установлен в 1
- j установлен на 2
- И так до тех пор, пока i = 3 и j = 2
Заметьте, что LBound и UBound имеют второй аргумент 2. Это указывает, что это верхняя или нижняя граница второго измерения. Это начальное и конечное местоположение для j. Значение по умолчанию 1, поэтому нам не нужно указывать его для цикла i.
Использование цикла For Each
Использование For Each лучше использовать при чтении из массива.Давайте возьмем код сверху, который выписывает двумерный массив.
' Для цикла For необходимо два цикла Debug.Print "i", "j", "Значение" For i = LBound(arrMarks) To UBound(arrMarks) For j = LBound(arrMarks, 2) To UBound(arrMarks, 2) Debug.Print i, j, arrMarks(i, j) Next j Next i
Теперь давайте перепишем его, используя цикл For Each. Как видите, нам нужен только один цикл, и поэтому гораздо проще написать:
' Использование For Each требует только одного цикла Debug.Print "Значение" Dim mark As Variant For Each mark In arrMarks Debug.Print mark Next mark
Использование цикла For Each дает нам массив только в одном порядке — от LBound до UBound. В большинстве случаев это все, что вам нужно.
Массивы
Последнее обновление: 30.10.2015
Массив представляет собой набор данных одного типа. Например, объявим массив элементов типа Integer:
Dim nums(5) As Integer nums(0) = 0 nums(1) = 1 nums(2) = 2 nums(3) = 3 Console.WriteLine(nums(3))
Здесь мы объявили массив из 6 элементов типа Integer. По умолчанию всем шести элементам в массиве присваивается 0.
Затем первым четырем элементам массива мы присваиваем некоторые значения
Обратите внимание, что индексация в массиве начинается с нуля. При этом мы не можем выйти за рамки установленной длины массива в 6 элементов
А следующий код вызовет исключение ArrayIndexOutOfRange,
поскольку восьмого элемента в массиве не существует, в нем определено только 6 элементов:
Dim nums(5) As Integer nums(7) = 7
В вышеприведенном примере мы уже неявно инициализировали члены массива, задав для не него размер в шесть элементов. Однако можно объявить массив,
а количество элементов указать потом:
Dim nums() As Integer
В таком случае нам его еще предстоит инициализировать. Мы это можем сделать так:
Dim nums() As Integer nums = New Integer(5) {} nums(0) = 0 nums(1) = 1 nums(2) = 2 nums(3) = 3
В данном примере мы c помощью ключевого слова New указываем, что хотим создать новый объект. Также указываем размер массива. А фигурные скобки служат для
инициализации массива. Однако нам необязательно присваивать все значения массива после объявления. Мы можем все сделать уже при объявлении массива:
Dim nums2 As Integer() = New Integer(5) {0, 1, 2, 3, 4, 5}
Таким образом, все элементы массива у нас уже будут иметь значение. При этом мы можем использовать сокращенный синтаксис при инициализации массива
без ключевого слова New, либо не задавать явным образом размер массива:
'Не указываем размер массива Dim nums1 As Integer() = New Integer() {0, 1, 2, 3, 4, 5} 'Сокращенный синтаксис инициализации Dim nums2 As Integer() = {0, 1, 2, 3, 4, 5}
В первой главе мы уже говорили, что тип переменной может выводиться компилятором автоматически. То же самое применимо и к массиву. Например:
Dim nums = {0, 1, 2, 3, 4, 5}
Кроме размера массив характеризуется таким понятием как размерность (dimension). В предыдущих примерах мы использовали одномерные массивы.
Но массивы бывают и многомерными. Например:
'Одномерный массив Dim nums1 As Integer() = {0, 1, 2, 3, 4, 5} 'Двухмерный массив Dim nums2 As Integer(,) = {{0, 1, 2}, {3, 4, 5}} Console.WriteLine(nums2(1, 1))
Здесь мы создали двухмерный массив, который можно представить в виде таблицы:
Двухмерный массив nums2
1 |
2 |
|
3 |
4 |
5 |
Изменение размера массива
При инициализации массива нам надо указать его размер, либо размер выводится из количества элементов. Однако иногда бывают ситуации, когда
надо по ходу программы добавить еще один элемент в массив. Это можно сделать с помощью ключевого слова ReDim.
Dim nums1 As Integer() = {0, 1, 2, 3, 4, 5} ReDim nums1(8)
ReDim пересоздает массив с новым размером. Чтобы сохранить все прежние элементы, нам надо также использовать ключевое слово Preserve.
Некоторые методы и свойства массивов
-
Свойство Length позволяет получить количество элементов массива
-
Свойство Rank позволяет получить размерность массива
-
Метод Reverse изменяет порядок следования элементов массива на обратный
-
Метод Sort сортирует элементы массива
Примеры использования:
Dim nums1 As Integer() = {8, 1, 5, 3, 4, 2} Dim lenght As Integer = nums1.Length() Console.WriteLine("количество элементов: {0}", lenght) Dim rank As Integer = nums1.Rank() Console.WriteLine("размерность массива: {0}", rank) nums1.Reverse() Array.Sort(nums1) Console.WriteLine(nums1(1))
НазадВперед
Чтение из диапазона ячеек в массив
Если вы читали мою статью о ячейках и диапазонах, то вы знаете, что VBA имеет чрезвычайно эффективный способ чтения из диапазона ячеек в массив и наоборот.
Public Sub ReadToArray() ' Объявить динамический массив Dim StudentMarks As Variant ' Считать значения в массив из первой строки StudentMarks = Range("A1:Z1").Value ' Запишите значения обратно в третий ряд Range("A3:Z3").Value = StudentMarks End Sub
Динамический массив, созданный в этом примере, будет двухмерным массивом. Как видите, мы можем прочитать весь диапазон ячеек в массив всего за одну строку.
В следующем примере будут считаны примеры данных студента ниже из C3: E6 Лист1 и распечатаны в Immediate Window.
Public Sub ReadAndDisplay() ' Получить диапазон Dim rg As Range Set rg = ThisWorkbook.Worksheets("Лист1").Range("C3:E6") ' Создать динамический массив Dim StudentMarks As Variant ' Считать значения в массив из листа 1 StudentMarks = rg.Value ' Вывести значения массива Debug.Print "i", "j", "Значение" Dim i As Long, j As Long For i = LBound(StudentMarks) To UBound(StudentMarks) For j = LBound(StudentMarks, 2) To UBound(StudentMarks, 2) Debug.Print i, j, StudentMarks(i, j) Next j Next i End Sub
Как видите, первое измерение (доступное через i) массива — это строка, а второе — столбец. Чтобы продемонстрировать это, взглянем на значение 44 в Е4 данных образца. Это значение находится в строке 2 столбца 3 наших данных. Вы можете видеть, что 44 хранится в массиве в StudentMarks (2,3).
Компоненты цикла For Each… Next
Компонент | Описание |
---|---|
element | Обязательный атрибут в операторе For Each, необязательный атрибут в операторе Next. Представляет из себя переменную, используемую для циклического прохода элементов группы (диапазон, массив, коллекция), которая предварительно должна быть объявлена с соответствующим типом данных*. |
group | Обязательный атрибут. Группа элементов (диапазон, массив, коллекция), по каждому элементу которой последовательно проходит цикл For Each… Next. |
statements | Необязательный** атрибут. Операторы вашего кода. |
Exit For | Необязательный атрибут. Оператор выхода из цикла до его окончания. |
*Если цикл For Each… Next используется в VBA Excel для прохождения элементов коллекции (объект Collection) или массива, тогда переменная element должна быть объявлена с типом данных Variant, иначе цикл работать не будет.
**Если не использовать в цикле свой код, смысл применения цикла теряется.

Эта тема закрыта для публикации ответов.