Основы программирования на VBA для Microsoft Excel. Учебное пособие
.pdfСлово Public задает область видимости на уровне проекта, т. е. функция, определенная с этим словом, будет доступна из любой части программного проекта, а также в проектах, которые ссылаются на данный проект.
Ключевое слово Static указывает на то, что локальные переменные, т. е. переменные, определенные внутри функции, будут сохраняться между ее вызовами.
Ключевые слова Public, Private и Static – это необязательные слова. В определении функции их может и не быть, но тогда по умолчанию функция будет иметь область видимости Public, а локальные переменные не сохранят своих значений между вызовами функции.
Процедуры отличаются от функций тем, что не возвращают результат. То есть вызов процедуры нельзя использовать в правой части оператора присваивания. Как и функции, процедуры выполняют действия, но результаты этих действий сохраняются в виде переменных.
Чаще всего процедуры воздействуют на данные, например, изменяют содержимое ячеек, таблиц баз данных, диаграмм. Процедуры могут определенным образом воздействовать на объекты приложения, например, скрывать или показывать рабочие листы в книге Excel.
Так же, как и описание функции, описание процедуры может начинаться с ключевого слова Public, Private или Static. Отличительными признаками процедуры являются ключевые слова Sub и End Sub, определяющие начало и конец процедуры.
В описании процедуры отсутствует и описание типа возвращаемого результата, так как процедура ничего не возвращает в место ее вызова. В теле процедуры ее имени ничего не присваивается. Таким образом, можно сказать, что процедура путем выполнения действий, заложенных в нее, меняет окружение (значения переменных).
Описание процедуры можно продемонстрировать следующим примером:
Public Sub Pro(X As Integer, Y As Integer) Z=X+Y
End Sub
Здесь Sub и End Sub – соответственно начало и конец описания процедуры, Pro – ее имя. Ключевое слово Public говорит о том, что это процедура уровня проекта, т. е. область ее видимости – весь программный проект. Параметры функции по умолчанию передаются по ссылке.
61
Вызов процедуры осуществляется двумя способами. При первом способе просто указывается имя процедуры и список параметров, например Pro X, Y. Список по количеству и типу параметров должен соответствовать списку, приведенному в описании процедуры.
Второй способ предусматривает использование ключевого слова Call, например Call Pro(X, Y). В этом случае параметры заключаются в круглые скобки.
При вызове вместо переменных можно задать конкретные значения, например Pro 2, 3 или Call Pro(2, 3). Для доступа к переменной Z на уровне проекта она должна быть объявлена в разделе описаний модуля с ключевым словом Public. При вызове процедур, имеющих одно и то же имя, но расположенных в разных модулях, перед именем процедуры указывается имя модуля. Имя модуля отделяется от имени процедуры точкой, например:
Module1.Pro 2, 3.
Диалоговые окна
Для обмена информацией через диалоговые окна в VBA предусмотрены встроенные функции InputBox и MsgBox. Функция MsgBox служит для вывода информационных сообщений, а функция InputBox – для их ввода. В диалоговом окне функции MsgBox кроме текстовых сообщений могут отображаться кнопки выбора и предупреждающие значки.
Пример использования функции MsgBox:
MsgBox "Вы не угадали. Продолжить ?", 32+4, "Сообщение программы"
В операторе вызова этой функции использовано три параметра, которые отделены друг от друга запятыми.
Первый параметр представляет собой текстовое сообщение, которое выводится в диалоговое окно на экран монитора.
Второй параметр состоит из двух частей, объединенных знаком плюс. Первая часть определяет вывод предупреждающих значков, вторая – количество и тип кнопок выбора. При отсутствии второго и третьего параметров в диалоговое окно будет выдано только текстовое сообщение.
При записи второго параметра могут использоваться обозначения в виде текстовых констант или заменяющих их числовых значений. Обозначения приведены в табл. 4 и 5.
62
|
|
|
|
|
Т а б л и ц а |
4 |
Значения второго аргумента функции MsgBox для кнопок |
|
|||||
|
|
|
|
|
|
|
Тип кнопок |
|
Значение |
|
Описание |
|
|
VbOkOnly |
|
0 |
|
|
Кнопка OK |
|
VbOkCancel |
|
1 |
|
|
Кнопки OK и Cancel |
|
VbAbortRetryIgnore |
|
2 |
|
|
Кнопки Abort,Retry и Ignore |
|
VbYesNoCancel |
|
3 |
|
|
Кнопки Yes, No и Cancel |
|
VbYesNo |
|
4 |
|
|
Кнопки Yes и No |
|
VbRetryCancel |
|
5 |
|
|
Кнопки Retry и Cancel |
|
|
|
|
|
|
Т а б л и ц а |
5 |
Значения второго аргумента функции MsgBox для значков |
|
|||||
|
|
|
|
|
|
|
Тип кнопок |
Значение |
|
|
Описание |
|
|
VbCritical |
16 |
|
Критическое сообщение |
|
||
VbQuestion |
32 |
|
Вопросительный знак |
|
||
VbExclamation |
64 |
|
Информационное сообщение |
|
||
При нажатии на кнопку в окне диалога функция MsgBox возвращает в место вызова число от 1 до 7, которое определяет, какая именно кнопка нажата. Возвращаемые значения и типы кнопок приведены в табл. 6.
Т а б л и ц а 6
|
Значения, возвращаемые функцией MsgBox |
||
|
и определяемые ими типы нажатых кнопок |
||
|
|
||
Возвращаемое |
Тип нажатой кнопки |
||
значение |
|||
|
|||
1 |
|
OK |
|
2 |
|
Cancel |
|
3 |
|
Abort |
|
4 |
|
Retry |
|
5 |
|
Ignore |
|
6 |
|
Yes |
|
7 |
|
No |
|
Третий параметр функции MsgBox определяет заголовок окна диалога. При его отсутствии в качестве заголовка используется текстовое сообщение «Microsoft Excel».
63
Приведенный пример использования функции MsgBox содержит только три параметра. На самом деле общее число параметров этой функции больше. Сведения об остальных параметрах можно найти в справочной системе Excel.
Пример использования функции MsgBox для проверки наличия данных в текстовых полях формы:
Private Sub CommandButton1_Click()
If TextBox1.Text = "" Or TextBox2.Text = "" Then MsgBox "Нет данных", vbExclamation, "Данные"
Exit Sub
Здесь слово «Данные» – это заголовок окна сообщения MsgBox, vbExclamation – ключевое слово, определяющее тип сообщения, слова «Нет данных» – это само сообщение. Private Sub CommandButton1_Click() и Exit Sub – это начало и окончание процедуры обработки события нажатия на командную кнопку CommandButton1.
Функция InputBox выводит в окно диалога запрос на получение информации и текстовое поле для ввода запрошенной информации. Введенная в текстовое поле строка возвращается в место вызова функции.
Пример использования функции InputBox: x=InputBox("Введите число : ", "Элемент массива", "0")
Здесь "Введите число : " – запрос на получение информации; "Элемент массива" – заголовок диалогового окна; "0" – значение, возвращаемое функцией по умолчанию. Возвращаемая строка может быть преобразована в число с помощью функции Val, например Val(x).
Массивы
Массив – это структурированный набор однотипных данных фиксированной размерности, объединенных одним именем. Каждый элемент массива имеет свой порядковый номер (индекс) в этом наборе. Имя массива является переменной структурного типа и совместно с индексом служит для доступа к конкретному элементу.
Массивы могут быть одномерными (с одним индексом на элемент массива) и многомерными, в которых идентификация элемента производится по нескольким индексам. Число измерений может достигать 60.
64
Примеры объявлений одномерного и двумерного массивов:
Dim Public m(4) As Integer Dim Private m(1, 4) As Integer
По умолчанию индексация элементов в массивах начинается с нуля. Нулевой индекс является базовым. В данном примере объявлен одномерный массив из пяти элементов и двумерный массив, состоящий из десяти элементов, разбитых на две группы по четыре элемента с индексами 0 и 1. Если в разделе General модуля поместить оператор Option Base 1, то элементы массива будут нумероваться с единицы.
Ключевое слово Dim служит для объявления массива, а слова Public и Private определяют область его видимости в программном проекте. После записи имени массива и его размерности определяется тип элементов. В данном случае элементами массива являются целые числа.
Индексацию можно задать и с помощью ключевого слова «To», например:
Dim m(2 To 5) As String
Здесь базовый индекс принимает значение 3 и в состав массива входят четыре элемента строкового типа с индексами 2, 3, 4, 5.
Базовый индекс может принимать и отрицательные значения, например:
Dim m(–2 To 5) As String
Подобным образом можно объявить и двумерный массив: Dim m(1 To 3, 1 To 5) As String
Определить массив можно с помощью функции Array, например:
Dim m As Variant
m=Array("Пн", "Вт", "Ср", "Чт", "Пт", "Сб") Debug.Print m(1)
Для проверки значений переменных, содержащих массивы, используется функция IsArray. Функция возвращает значение True, если переменная содержит массив, и False в противном случае, например:
IsArray(m)
Элементы массива можно задавать с клавиатуры, например:
For i=1 To 5
m(i)=InputBox("Введите элемент массива: ") Next
65
Элементам массива можно присвоить значения ячеек рабочего листа, например:
For i=1 To 5 m(i)=Cells(1 , i)
Next i
Массив может быть заполнен и с помощью генератора случайных чисел, например:
For i=1 To 5 a(i)=Int(Rnd(i)*100)
Next i
Если в ходе выполнения программы размер массива необходимо изменить, то этот массив объявляют как динамический, без указания его размерности. Пример объявления динамического массива:
Dim m( ) As String
Количество элементов в динамическом массиве и его размерность можно переопределить с помощью ключевого слова ReDim, например:
ReDim Preserve m(n) As String
Необязательное ключевое слово Preserve используется для сохранения данных в массиве при изменении его размерности. Переменная n до выполнения оператора должна принять конкретное значение.
При переопределении количества элементов в динамическом массиве можно использовать функцию UBound, например:
ReDim Preserve m(UBound(m)+10) As String
В результате переопределения количество элементов в массиве будет увеличено на десять. Значения прежних элементов сохраняются.
Для освобождения памяти, отведенной для динамических массивов, используется функция Erase(Список массивов). Список массивов содержит их имена, разделенные запятой.
Эта же функция используется для повторной инициализации элементов статических массивов. При повторной инициализации статических массивов их элементам вместо чисел или строк фиксированной длины присваиваются значения, равные нулю, а для строк переменной длины присваивается значение пустой строки. В массивах типа Variant каждому элементу присваивается значение Empty.
66
Файлы
Сточки зрения возможностей обработки, в VBA допустима работа
стремя типами текстовых файлов:
1)файлами последовательного доступа;
2)файлами с произвольным доступом;
3)бинарными файлами.
Файлы последовательного доступа состоят из строк в общем случае разной длины, отделенных друг от друга двумя специальными символами – возвратом каретки и переводом строки. Чтение и запись в файл производится построчно. Для доступа к записи требуется чтение всех предшествующих записей.
Файлы с произвольным доступом состоят из набора записей одинаковой длины. Размер записи указывается при открытии файла. В этом файле можно обратиться к отдельной записи по ее номеру.
При открытии файла произвольного доступа, в отличие от файла последовательного доступа, не надо специально указывать, открывается он для ввода или вывода информации. Ввод и вывод информации определяют команды Put и Get.
Бинарные файлы являются частным случаем файла произвольного доступа и представляются в виде потока байтов, не объединенных ни в какие логические структуры. Размер записи в этом файле равен 1 байту.
Чтение и запись текстовых файлов
Текстовый файл представляет собой последовательный набор строк. Такие файлы часто встречаются на практике. Многие редакторы позволяют сохранить созданный документ в виде текстового файла.
Прежде чем начать работу с файлом, его надо открыть, т. е. связать с целым числом – файловым номером, и указать режим работы. Это делается при помощи оператора Open:
Open "c:\ a.txt" For Input As #1
Здесь "c:\ dat.txt" – это строка, определяющая путь доступа к файлу и его имя dat на диске c:, #1 – целый положительный файловый номер, a Input – режим работы. Для текстовых файлов режим работы может быть установлен как Input (для чтения), Output (для записи) или Append (для добавления в конец файла). В операторах эти режимы могут быть заданы также соответствующими числами: 1, 2 и 8.
67
Если файл открыт для чтения, то извлечь из него информацию можно при помощи операторов Input или LineInput.
Например, оператор:
Input #1, s1, s2
считывает данные из открытого файла последовательного доступа и присваивает их переменным s1 и s2. Считывается информация порциями до разделителей, в качестве которых используются запятые. Поэтому если в файле записана строка "Hello, World ", то в переменную s1 будет считано значение "Hello", а в в переменную s2 – значение
"World".
Данные, считываемые с помощью оператора Input, обычно записываются в файл с помощью оператора Write, например:
Write #1, "Hello World"
Для записи можно также использовать оператор Print, например:
Print #1, "Hello, World"
Оператор LineInput позволяет считывать всю строку целиком, например, при использовании оператора LineInput #1, s переменная s будет иметь значение "Hello, World".
Для считывания данных из файла может использоваться также функция Input(n, #1), где переменная n определяет число считываемых символов. Если n = 1, производится посимвольное считывание данных.
С помощью этой функции считываются данные, записанные с помощью операторов Print или Put.
Элементы управления
Элементы управления – это встроенные в VBA стандартные объекты, с помощью которых автоматизируются процессы работы с информацией в приложении. Можно и программно создавать новые элементы управления, однако используется это редко.
Элементы управления используются для ввода и отображения информации, а также для автоматического выполнения определенных, заранее запрограммированных действий.
Практически все встроенные элементы управления можно располагать как на рабочих листах, так и в формах; исключение составляют лишь несколько элементов управления, которые можно использовать только в формах.
68
Панели элементов управления
В Excel cуществуют две панели, из которых можно выбирать элементы управления. Первая панель – это панель элементов управления ActiveX. Она вызывается из меню Вид/ Панели инструментов/ Элементы управления.
Вторая панель – это панель инструментов Формы. Она вызывается командой Вид/ Панели инструментов/ Формы.
Панель элементов ActiveX использует режим конструктора и позволяет программировать обработку событий, распознаваемых элементом управления. Для удобства конструирования элементов упраления в режиме конструктора отключена реакция элемента управления на события.
Код сохраняется вместе с рабочим листом, на котором расположен объект ActiveX, и доступ к нему возможен только в режиме конструктора.
При выходе из режима конструктора элемент управления переходит в рабочий режим и его можно использовать для автоматизации приложения.
Панель инструментов Формы можно использовать для выбора элементов управления и установления их связи с макросами. Элементы с этой панели совместимы с ранними версиями MS Excel, начиная с вер-
сии 5.0.
Панель Формы не использует режим конструктора. После создания элемента управления с использованием этой панели его можно связать с ранее созданным макросом командой Назначить макрос из контекстного меню.
Для изменения макроса нужно выделить элемент управления и из контекстного меню выбрать Назначить макрос/ Правка. Код макроса сохраняется в стандартном модуле редактора VBA.
Использование элементов ActiveX на рабочих листах книги Excel
Для размещения элемента управления на рабочем листе Excel необходимо отобразить саму панель элементов управления. Это можно сделать командой Вид/ Панели инструментов/ Элементы управления.
Далее нажатием на левую кнопку мыши производится выбор требуемого элемента на панели элементов управления. Простым нажатием на левую кнопку мыши этот элемент размещается в нужном месте рабочего листа книги Excel.
69
Все перечисленные действия выполняются в режиме конструктора, поэтому элементу можно назначить процедуру обработки события, вызываемую при активизации данного элемента.
Войти в редактор обработки события и прописать необходимые действия можно, если дважды щелкнуть по объекту левой кнопкой мыши или правой кнопкой вызвать контекстное меню и выбрать опцию Исходный текст.
После этих действий нужно выйти из режима конструктора. Выход из этого режима обеспечивается нажатием на левый верхний объект на панели элементов управления. Наведение указателя на этот объект приводит к появлению надписи «Выход из режима конструктора».
После выхода из режима конструктора элемент управления можно использовать для выполнения прописанных действий. Удаляется элемент управления только после включения режима конструктора.
Использование панели инструментов Формы
Иногда требуется обеспечить запуск раннее созданного макроса с помощью элемента управления, например, с помощью командной кнопки, расположенной на рабочем листе книги Excel.
Связь макроса с элементом управления можно обеспечить с помощью панели инструментов Формы. Для вызова этой панели нужно дать команду Вид/ Панели инструментов/ Формы.
На панели инструментов Формы можно выбрать требуемый элемент управления и разместить его на рабочем листе книги Excel. В всплывающем окне с именем «Назначить макрос объекту» выбрать имя макроса и нажать кнопку ОК. Можно также вместо выбора имени макроса нажать кнопку Создать и записать макрос вручную.
Если элемент управления уже расположен на рабочем листе, то для его связи с макросом нужно нажатием правой кнопкой мыши вызвать контекстное меню этого объекта, выбрать пункт Назначить макрос и в всплывающем окне выбрать имя требуемого макроса.
Выделенный элемент управления легко удалить, используя соответствующую команду контекстного меню.
Отличающим признаком элемента панели инструментов Формы является наличие контекстного меню и отсутствие в нем команды Свойства.
По этим признакам можно легко определить, с каким элементом имеет дело пользователь: с элементом ActiveX или с элементом панели инструментов Формы.
70
