Массивы Имя - правила именования массивов аналогичны правилам именования переменных. Размерность - одномерные массивы напоминают одну строку таблицы, ячейки которых содержат данные. Многомерные массивы имеют больше измерений. Тип – тип элементов массива такой же как у переменных. Если тип не указан явно, массив получит тип по умолчанию - Variant. Массивы Нумерация элементов подчиняется правилам: - По умолчанию нумерация элементов массива начинается с 0. Первый по счету элемент получит индекс 0, второй - 1 и т.д.
- В объявлении отдельного массива можно явно указать индекс его первого и последнего элемента, разделив их ключевым словом To.
- Если вы хотите, чтобы индексы всех массивов начинались с 1, добавьте в раздел объявлений модуля (General) команду Option Base 1.
Объявление массивов Dim MyArrayA(30) As Single Объявленный массив MyArrayА содержит 31 элемент (с индексами от 0 до 30) типа Single. Нумерация явно не задана, элементы получат индексы по обычным правилам. Dim MyArrayB(1 To 25) Массив MyArrayB содержит 25 элементов. Границы нумерации заданы явно - первый элемент получит индекс 1, второй - 2 и т.д. Тип не указан - в массиве можно хранить любые данные. - Объявить одномерный массив на 3 элемента
- Внести в первый элемент число 5 в программе, во второй - запросив значение с помощью окна ввода
- Третий элемент произведение первого и второго.
Dim A(2) As Integer A(0) = 5 A(1) = InputBox("Введите второй элемент") A(2) = A(0) * A(1) Индекс
| 0
| 1
| 2
| Значение
| 5
| 2
| 10
| Сгенерировать массив из 5 целых значений Dim mas(4) As Integer For i% = 0 To 4 mas(i) = Int((10 * Rnd) + 1) Next i В примере используется неявное объявление типа переменной. i% — неявное объявление переменной i типа Integer. Такая конструкция по сути заменяет следующую: Dim i As Integer Многомерные массивы Многомерный массив – это таблица данных в двух или более измерениях. Для обращения к элементу такого массива нужно индексы по количеству измерений. Такая комбинация называется координатами ячейки массива. Представить многомерные массивы можно так: - одномерный – строка записей
- двухмерный – лист
- трехмерный – книга
- четырехмерный – книжная полка
- пятимерный – книжный шкаф
- шестимерный – библиотека
- семимерный – несколько библиотек
Многомерные массивы Чаще всего применяются двумерные массивы (матрицы) Элементы матрицы снабжаются двумя индексами, заключенными в круглые скобки и разделенными запятой. Первый индекс – номер строки, второй – номер столбца, на пересечении которых расположен элемент в таблице (матрице). Например: B(2,3)=6 Объявление многомерных массивов Dim MyArrayA(10, 1) As Single Массив MyArrayА содержит 11 строк и 2 столбца типа Single Dim MyArrayB(1 To 25, 1 To 5) Массив MyArrayB содержит 25 строк и 5 столбцов. Объявить двумерный массив 5х2 и ввести в него фамилии и номера телефонов сотрудников. Dim MyArray(1 To 5, 1 To 2) For i = 1 To 5 MyArray(i, 1) = InputBox("Введите фамилию №" & i) MyArray(i, 2) = InputBox("Введите Телефон №" & i) Next i 1
| Иванов
| 898989898
| 2
| Петров
| 343434343
| 3
| Сидоров
| 565656565
| 4
| Александров
| 121111212
| 5
| Маринин
| 545454544
| Пример обращения к многомерным массивам Заполнить массив 10х10 случайными целыми числами от 1 до 10 Dim MyArray(1 To 10, 1 To 10) For i = 1 To 10 For j = 1 To 10 MyArray(i, j) = Int(Rnd(1) * 10) Next j Next i ReDim [Preserve] varname(subscripts) [As Type] [, varname(subscripts) [As Type]] varname – имя существующего массива; subscripts – размерность существующего массива; Type - любой тип VBA, отдельный оператор As Type для каждого массива; Preserve – его использование приводит к тому, что данные уже имеющиеся в массиве, сохраняются после изменения его размерности. Dim Array() As Single ‘объявляет динамический массив ReDim Array(2, 9) ‘ делает массив двумерным ReDim Array(3, 7) ‘ заменяет размер двумерного массива ReDim Preserve Array(1 To 3, 1 To 5) Пример переопределения размерности Программа просит пользователя ввести количество сотрудников, которое сохраняет в переменной Size, а потом создает массив, одна из размерностей которого равняется Size. Dim MyArray() Size = InputBox("Введите количество сотрудников") ReDim MyArray(1 To Size, 1 To 2) ReDim Preserve MyArray(1 To Size, 1 To 4) . Array (Список аргументов) – быстро заполняет массив. MyArray = Array(1, 2, 6, 9, 19) IsArray (Имя переменной) – возвращает True, если переменная является массивом Dim MyArray(10) Dim MyArr If IsArray(MyArray) Then _ MsgBox (“MyArray - массив") _ Else MsgBox (“MyArray - не массив") If IsArray(MyArr) Then _ MsgBox (“MyArr - массив") _ Else MsgBox (“MyArr - не массив") . LBound (Имя Массива, Размерность) – возвращает нижнюю границу для указанной размерности массива. UBound (Имя Массива, Размерность) – возвращает верхнюю границу для указанной размерности массива. . Пример. Создадим динамический двумерный массив, размерности которого заданы с помощью генератора случайных чисел Dim MyArray() ReDim MyArray(Int(Rnd * 5 + 5), Int(Rnd * 5 + 5)) MsgBox ("Двумерный массив MyArray:" + Chr(13) + _ "Первая размерность:" + _ Str(LBound(MyArray, 1)) + " -" + _ Str(UBound(MyArray, 1)) + Chr(13) + _ "Вторая размерность:" + _ Str(LBound(MyArray, 2)) + " -" + _ Str(UBound(MyArray, 2))) Далее - используем двойной цикл для заполнения массива случайными числами For i = LBound(MyArray, 1) To _ UBound(MyArray, 1) For j = LBound(MyArray, 2) To _ UBound(MyArray, 2) MyArray(i, j) = Int(Rnd * 100) Next j Next i Erase Имя_массива - очистить массив. Элементы обычных массивов, содержащих числовые данные, обнуляются. Если мы применим команду Erase к массиву строк - каждый его элемент будет хранить строку нулевой длины (""). Split(Имя Строки, Разделитель) – превращает символьную строку в массив. Данные присваиваются заранее объявленному строковому (As String) одномерному динамическому массиву. Размерность устанавливается автоматически в зависимости от количества подстрок. Dim MyArray() Dim MyStr As String MyStr = "if/vloockup/sum/count/isnumber/mid" MyArray = Split (MyStr, "/") MsgBox MyArray (0) ' возвращает IF MsgBox MyArray (1) ' возвращает VLOOKUP MsgBox MyArray (2) ' возвращает SUM MsgBox MyArray (3) ' возвращает COUNT MsgBox MyArray (4) ' возвращает ISNUMBER MsgBox MyArray (5) ' возвращает MID Join(Имя Массива, [Разделитель]) - слияние всех элементов массива в одну строку со вставкой между ними необязательного разделителя. Разделитель – символ, используемый для разграничения подстрок в возвращаемой строке. Если параметр опущен, применяется символ пробела (" "). Если аргумент строка нулевой длины (""), производится конкатенация всех элементов без разделителей Dim MyArray(1 To 3) MyArray = Array("Новая", "функция", "VBA") MsgBox Join(MyArray, "_") 'возвращает "Новая_функция_VBA" Оператор For Each для работы с массивами For Each element In group [ statements ] [ Exit For ] [ statements ] Next [ element ] element – переменная, используемая для циклического прохода элементов массива, должна быть объявлена с соответствующим типом данных. group – группа элементов массив, по каждому элементу которой последовательно проходит цикл For Each statements – операторы. Exit For – оператор выхода из цикла до его окончания. Пример с оператором For Each Пример: Присвоить массиву список наименований животных и в цикле For Each записать их в переменную a. Вывести переменную а в диалоговое окно MsgBox. Dim element As Variant Dim a As String, group As Variant group = Array("бегемот", "слон", "кенгуру", "тигр", "мышь") a = "Массив содержит значения:" & Chr(13) Процедуры и функции Процедура (функция) - это программная единица VBA, включающая операторы описания ее локальных данных и исполняемые операторы. Процедура – это блок кода, который будет выполняться всякий раз при вызове этой процедуры. Процедуры и функции Процедуры помогают: - сократить код программы,
- улучшить модификацию кода,
- повысить читаемость,
- улучшить понимание кода программистом.
Главное отличие процедуры от функции заключается в том, что функция возвращает в точку вызова некое значение, которое, как правило, является результатом обработки переданной функции информации. А процедура лишь выполняет какие-либо действия, но ничего в точку вызова не возвращает. Передача информации в процедуры Главное назначение процедур VBA изменении состояния системы документов, изменение состояния самого программного проекта. Процедуры VBA оперируют, в основном, с объектами MS Office. Есть два способа получения и передачи информации, изменяя тем самым состояние системы документов. Первый и основной способ состоит в использовании параметров процедуры. Второй способ состоит в использовании глобальных переменных и объектов, как для получения, так и для передачи информации. Процедуры [область действия] Sub имя [(список аргументов)] Операторы End Sub область действия: Public — процедура будет доступна для всех модулей в данном проекте VBA, Private — доступна только для текущего модуля имя — обязательный элемент, имя процедуры список аргументов — список переменных - параметры, которые передаются в процедуру при ее вызове (формальные параметры), разделяются запятой. Каждый аргумент имеет и тип данных. операторы— любая группа операторов. Список аргументов [Optional] [ByVal | ByRef] [ParamArray] имя параметра[( )] [As type] [= defaultvalue] Если параметр является необязательным, необходимо указать его значение по умолчанию: Optional [ByVal | ByRef] имя параметра As тип данных = значение по умолчанию Аргументы в VBA могут быть переданы двумя способами: - ByVal – по значению - процедуре передаётся только значение (копия аргумента), изменения аргумента внутри процедуры будут потеряны
- ByRef – по ссылке - передаётся а в памяти, изменения, сделанные с аргументом внутри процедуры, будут сохранены при выходе из процедуры.
Вызов подпрограмм Call имя подпрограммы [параметры] имя подпрограммы — обязательный элемент, содержит имя вызываемой процедуры. параметры — необязательный элемент, это разделяемый запятыми список переменных, массивов или выражений, передаваемых в процедуру (фактические параметры). Для передачи в процедуру полного массива следует воспользоваться именем массива с ратор считается устаревшимпустыми скобками Оператор считается устаревшим. Вызов подпрограммы осуществляется просто по имени процедуры/функции Функции блок кода, который будет возвращать значение. [обл.действия] Function имя [(список арг-ов)] [As тип] Операторы [имя = выражение] End Function тип — необязательный элемент. Тип данных значения, возвращаемого подпрограммой Function. выражение — возвращаемое значение подпрограммой Function. Использование Function аналогично использованию стандартных функций. Обращение к ней можно записать в выражении Пример Процедуры Пример. Опросить пятерых пользователей, обработав и записав их имя и возраст. Блок в расчете на одного пользователя: Пример Процедуры Процедура обработки одного пользователя, которая получает номер пользователя как аргумент. Пример Процедуры Код с применением процедуры: UserInput (i) вызов процедуры для пользователя с номером i Пример Функции Пример функции возводит переданное ей число во вторую степень. Прерывание процедур и функций VBA Завершение выполнения процедуры Exit Sub Завершение выполнения функции Exit Function Полное завершение выполнения программы End Необходимо перед оператором End выводить пользователю сообщение о том, что будет происходить и почему. В противном случае пользователи могут не понять, почему программа, которую они используют, внезапно прекратила работу. Литература - Лебедев, В. М. Программирование на VBA в MS Excel : учебное пособие для вузов. — 2-е изд., испр. и доп. — Москва : Издательство Юрайт, 2020. — 306 с. —URL: https://urait.ru/bcode/447096
- Иванова Г.С. Технология программирования: : учебник / Г.С. Иванова. 3-е изд., стер. М. : КНОРУС, с. (Бакалавриат)., 2016.
- Технология программирования / Ю.Ю. Громов, О.Г. Иванова, М.П. Беляев, Ю.В. Минин ; Тамбовский государственный технический университет. – Тамбов : Тамбовский государственный технический университет (ТГТУ), 2013. – 173 с. : ил. – Режим доступа: по подписке. – URL: http://biblioclub.ru/.
- Лаврищева, Е. М. Программная инженерия. Парадигмы, технологии и CASE-средства : учебник для вузов / Е. М. Лаврищева. — 2-е изд., испр. — Москва : Издательство Юрайт, 2021. — 280 с. // Образовательная платформа Юрайт [сайт]. — URL: https://urait.ru/bcode/470942
|