Vba excel. сортировка массива

Алан-э-Дейл       15.08.2023 г.

Массивы в 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. Затем,​ нажимая​. Массив – это​

  1. ​Вводная статья для тех,​. Для этого выберите​ разобрали основные понятия​ принимающий ссылку на​ если бы купил​
  2. ​ вопросов.​ для выполнения последующих​ сумму всех элементов​ значение, соответствующее первому​
  3. ​ быть введены вручную,​Preserve​ из примеров, при​ массива.​
  4. ​ мы рассмотрели в​ получившиеся суммы сложит.​CTRL+SHIFT+ENTER​ просто набор неких​
  5. ​ кто никогда не​ любую ячейку массива​ и сведения касаемо​ один или несколько​​ 2 л молока​​Функция ИНДЕКС в Excel​

​ действий? Ничего сложного!​ в таблице. В​ значению в таблице.​ а только лишь​, можно изменить размер​ объявлении двумерного массива​Массивы Visual Basic, о​ статье «Сумма в​ Получится результат =​. Эти формулы вводятся​

Выделение массива в Excel

​ элементов (значений).​ использовал формулы массива.​ и нажмите комбинацию.​ массивов в Excel.​ диапазонов ячеек. Ссылки​ и 4 кг​ возвращает данные из​ Пример 1:​ нашем примере сумма​

  1. ​ Однако достаточно ввести​ при помощи комбинации​ только последнего измерения​ индексы его измерений​ которых шла речь​ Excel».​
  2. ​ 33.​​ только в ячейки​​Т.е. обычная функция СУММ()​Без формул массива (array​Самое простое, что Вы​​ В этом уроке​ на два и​ яблок на основании​​ таблицы или определенного​​Перейдите на ячейку с​​ равна 45. В​​ формулу массива в​

    ​ клавиш CTRL+SHIFT+Enter. Если​​ массива.​​ разделяются запятой:​ выше, считаются одномерными.​Массивы в Visual Basic​​Корректировка формулы массива в​​ листа. Однако, если​

    ​ в качестве аргумента​

  3. ​ 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
2
3
4
5
6
7
8

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
2
3
4
5
6

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
2
3
4

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
2
3
4
5
6
7
8
9

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
2
3
4
5
6
7
8
9

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
2
3
4
5
6
7
8
9
10
11

Subtest3()

Dimelement AsVariant,aAsString,group AsVariant

group=Array(«бегемот»,»слон»,»кенгуру»,»тигр»,»мышь»)

‘или можно присвоить массиву значения диапазона ячеек
‘рабочего листа, например, выбранного: group = Selection

a=»Массив содержит следующие значения:»&vbNewLine

ForEachelement Ingroup

a=a&vbNewLine&element

Next

MsgBoxa

EndSub

Повторим ту же процедуру VBA, но всем элементам массива в цикле For Each… Next присвоим значение «Попугай». Информационное окно MsgBox выведет список наименований животных, состоящий только из попугаев, что доказывает возможность редактирования значений элементов массива в цикле For Each… Next.

1
2
3
4
5
6
7
8
9
10
11
12

Subtest4()

Dimelement AsVariant,aAsString,group AsVariant

group=Array(«бегемот»,»слон»,»кенгуру»,»тигр»,»мышь»)

‘или можно присвоить массиву значения диапазона ячеек
‘рабочего листа, например, выделенного: group = Selection

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
2
3
4
5
6
7
8
9
10
11
12
13
14

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

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, иначе цикл работать не будет.

**Если не использовать в цикле свой код, смысл применения цикла теряется.

Гость форума
От: admin

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