Как работать с массивами в VBA Массив – это особая переменная, содержащая данные одного типа. Зачем они нужны? Конечно, во многих случаях можно обходится и без массивов, но! Давайте представим ситуацию. Что проще – обрабатывать текст по одной букве или как единый блок однотипных элементов – в данном случае символов? Что будет проще – перебирать все указанные ячейки, присваивая каждой свое имя или поместить их в некую виртуальную группу и затем обращаться по номеру в этой группе? Конечно вариант с группой, а абсурдность первого варианта очевидна, даже если ячеек всего лишь 50. А если их тысяча? Так вот, во втором случае мы имеем дело с массивом. Другое дело, что создание массивов может показаться сложным, однако это далеко не так. Как с массивами можно работать с ячейками и с листами, с строками и с книгами, с таблицами и с рядами диаграмм, и так далее и так далее Какие же бывают массивы и как их применять? Начнем с того, что каждый элемент массива имеет свой порядковый номер, то есть индекс. Чтобы указать нужный элемент, надо просто задать в скобках его номер. Например, запись CellArray(520) означает, что используется 520-й элемент массива CellArray. При этом важное значение имеет способ нумерации элементов массива. Существуют разные классификации массивов, но для себя я выделяю три варианта Вариант первый. Массив с заранее заданными элементами. Например, таким образом можно задать список месяцев Dim MonthList as string MonthList = Array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", _ "Октябрь", "Ноябрь", "Декабрь"). В таких массивах счет идет с нуля, поэтому если его объявить и затем выполнить следующие команды DateIndex=Month(“2.01.2019”) MyMonth=MonthList(DateIndex) То результат будет не январь, а февраль Вот таким выглядит примерно будет результат
Второй тип – это статические массивы. При этом границы их индексов задаются при объявлении таких массивов, например, так Dim MyMas_1 (1 to 10) as integer Dim MyMas_2 (1 to 10 ,1 to 20) as double В первом случае массив одномерный, во втором двухмерный. Двухмерным является , в частности, массив, описывающий шахматные клетки Dim ChessCell (1 to 8, 1 to 8) as Object Если запустить такой макрос Sub SetChessCells() Dim ChessCell(1 To 8, 1 To 8) n = 1 For i = 1 To 8 For j = 1 To 8 ChessCell(i, j) = n n = n + 1 Next Next For i = 1 To 8 For j = 1 To 8 ActiveCell.Offset(j, i).Value = ChessCell(i, j) If i Mod 2 = 1 Then If ChessCell(i, j) Mod 2 = 1 Then ActiveCell.Offset(j, i).Interior.Color = RGB(0, 0, 0) End If End If If i Mod 2 = 0 Then If ChessCell(i, j) Mod 2 = 0 Then ActiveCell.Offset(j, i).Interior.Color = RGB(0, 0, 0) End If End If Next Next End Sub То получим следующий результат
При этом количество измерений может быть любым! Наконец, третий вид массивов – динамические. Они сходны с предыдущими, но количество элементов заранее неизвестно Dim MyMas() as integer Redim MyMas (1 to 10) - задаем границы, то есть индексы массива от 1 до 10 Redim MyMas (5) – задаем границы от 0 до 5. Обратите внимание, что нижняя граница явно не указана. При этом значения всех элементов уничтожены. А вот если написать уже так Redim preserve myMas (9) То количество элементов увеличится с 6 до 10 ( не забываем что тут счет пойдет с нуля, но существующие элементы сохранятся. Как же использовать массив? MyMas(1)=5 - это означает: присвоить элементу массива MyMas с индексом 1 значение 5. Самое интересное, что если тип массива не указан , то это будет цифра 5, но если тип String, это будет буква 5 (да-да!). Вот таким образом можно внести в массив MyUsers значения из предварительно выделенных ячеек с именами пользователей Dim n As Integer n = Selection.Count Dim MyUsers() As String ReDim MyUsers(1 To n) n = 1 For Each s In Selection MyUsers(n) = s.Value n = n + 1 Next Кстати, можно поступить проще, например так MyCells=Range (“A1:D10”) Массив, полученный таким образом всегда будет двухмерным, даже если выделены ячейки только в одном столбце или одной строке, ведь адреса ячеек в VBA содержат и номер строки и номер столбца. ActiveCell.Value=MyMas(7) – присвоит активной ячейке значение элемента MyMas с индексом 7. Еще раз обратите внимание – с индексом 7. А будет это седьмой элемент или нет – зависит от того , с какого числа задаются индексы. Никто не мешает задать такой вариант Dim MyMas( 100 to 110) Тогда оператор ActiveCell.Value=MyMas(7) вообще вызовет ошибку. Хотя седьмой элемент там конечно есть, но вот элемент с индексом 7 в таком массиве отсутствует Чтобы узнать границы массива, можно использовать специальные команды. Наибольший индекс массива MyUsers даст оператор LBound(MyUsers), а наибольший индекс даст оператор UBound(MyUsers). Учтите, что если массив многомерный, то после его названия надо указывать его размерность. Если мы имеем массив MyMas(1 to 5 , 1 to 10), то конструкция Ubound (MyMas, 1) вернет результат 5, а конструкция Ubound (MyMas ,2) даст 10. Таким образом, чтобы вывести предпоследний элемент массива MyUsers, можно применить конструкцию MsgBox MyUsers(Ubound(MyUsers)-1)
Если указать неверный индекс массива или указать несуществующую размерность, получим ошибку
Для создания массива из подстрок удобно использовать функцию SPLIT Split возвращает одномерный массив, содержащий подстроки, из строкового выражении с учётом указанного разделителя Split(expression[, delimiter[, limit[, compare]]])
Например, следующая процедура Sub Get_Last() MyMas = Split(ActiveCell.Value, " ") ActiveCell.Offset(0, 1).Value = MyMas(UBound(MyMas)) End Sub Даст результат, показанный на рисунке ниже
Ну, а очистить элементы любого массива можно простой командой Erase Erase MyUsers На этом пока все, удачной работы! | |
| |
Просмотров: 257 | | |
Всего комментариев: 0 | |