Курс MS Excel предназначен для всех кому необходимо работать с большим количеством данных и отчетов

Read more

Изучите все возможности PowerPoint по подготовке стильных современных презентаций

Read more

Microsoft Project предназначен помочь менеджеру проекта в разработке и отслеживании выполнения задач .


Применение массивов в VBA

Как работать с массивами в 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]]])

  • expression - строковое выражение, содержащая подстроки и разделители. Обязательный параметр.
  • delimiter - текстовый разделитель. Необязательный параметр. Если опущен, то предполагается, что разделителем является символ пробела.
  • limit - количество подстрок, которое необходимо вернуть. -1 или отсутствие параметра означает, что вернуть надо все подстроки.
  • compare - константа, указывающая тип сравнения для символов разделителей. 1 - текстовое сравнение (без учёта регистра), 0 - бинарное сравнение (с учётом регистра).

Например, следующая процедура

Sub Get_Last()

    MyMas = Split(ActiveCell.Value, " ")

    ActiveCell.Offset(0, 1).Value = MyMas(UBound(MyMas))

 End Sub

Даст результат, показанный на рисунке ниже

Ну, а очистить элементы любого массива можно простой командой Erase

Erase MyUsers

На этом пока все, удачной работы!

Категория: Обучение VBA | Добавил: Sergey_Haruk (13.11.2019)
Просмотров: 257 | Теги: пример массивов в VBAA, работа в VBA, практика VBA, использование массивов, Excel и VBA, обучение VBA на примерах, работа в VBA с массивами, применение массивов, массивы в VBA, применение VBA в Excel | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: