VBA. Практическое программирование
.pdf
Типы данных, переменные, константы
Const Pi as Double = 3.14159
Private Const MaxTic As Integer = 100.
В дальнейшем эта константа может использоваться в программе, и попытка ее изменения может вызвать ошибку.
VBA имеет множество собственных констант, их использование улучшает восприятие и понимание текста программ. Так, например, если мы хотим использовать какой-нибудь цвет для окраски фона или шрифта, мы вместо числового кода цвета может использовать соответствующую константу. Имена и значения цветовых констант приведены в таблице 4.
|
|
Таблица 4 |
|
Константы VBA для обозначения цветов |
|||
|
|
|
|
Константа |
Числовое значение |
Öâåò |
|
(16-ричная кодировка) |
|||
|
|
||
|
|
|
|
VbBlack |
0x0 |
Черный |
|
VbRed |
0xFF |
Красный |
|
VbGreen |
0xFF00 |
Зеленый |
|
VbYellow |
0xFFFF |
Желтый |
|
VbBlue |
0xFF0000 |
Синий |
|
VbMagenta |
0xFF00FF |
Розовый |
|
VbCyan |
0xFFFF00 |
Голубой |
|
VbWhite |
0xFFFFFF |
Белый |
|
|
|
|
|
Например, в следующей строке определяется красный цвет фона элемента управления Label1
Label1.BackColor = VbRed.
С описанием стандартных констант можно познакомиться в справочной системе VBA.
Теперь давайте проделаем очередное упражнение. Мы сейчас в электронной таблице создадим небольшой проект, в котором осуществляется ввод букв в элемент управления Label1 и ячейку таблицы без помощи клавиатуры. Этот пример иллюстрирует удачное сочетание возможностей электронной таблицы, элементов управления и языка VBA.
Итак, ставится задача — ввести в ячейку электронной таблицы какую-либо строку без помощи клавиатуры.
31
1. Основы VBA
Упражнение 4
Известно, что каждая буква хранится в памяти компьютера в виде числового кода. Для строчных букв русского алфавита для кодирования отведен диапазон чисел от 224 (буква «а») до 255 (буква «я»). Первый шаг — использовать элемент управления, который позволяет выводить в ячейку числа из этого диапазона.
Для этого используется элемент «Полоса прокрутки» (ScrollBar1), у которого есть очень интересное свойство LinkedCell. Используя это свойство, можно числовое значение, создаваемое полосой прокрутки в зависимости от положения ползунка копировать в ячейку рабочего листа.
1.Откройте чистую рабочую книгу Excel и убедитесь, что находитесь на рабочем листе «Лист1»
2.Вызовите панель элементов управления и если есть необходимость, перейдите в режим конструктора
3.Через эту же панель откройте окно свойств
4.Создайте на рабочем листе элемент Надпись (Label) и дайте ему имя Lbl1, а свойство Caption очистите от символов.
5.Создайте элемент Полоса прокрутки (ScrollBar). Разместите
ååгоризонтально, и если она выделена, то в окне свойств можно будет менять свойства этого объекта.
6.Используя окно свойств, установите следующие свойства объекта ScrollBar1
Min=224
Max=255
LinkedCell=A4
7.Выйдите из режима конструктора (Отожмите соответствующую кнопку на панели элементов управления) и, передвигая ползунок полосы прокрутки убедитесь, что в ячейке А4 происходит изменение числа от 224 до 255.
8.Следующее действие — превратить это число в букву. Используем возможности самой электронной таблицы. В ячейку В4 запишем формулу =Символ(А4). Теперь в этой ячейке будет отображаться тот символ, код которого находится в в ячейке А4. В этом Вы можете убедиться, «поработав» с полосой прокрутки.
Заметим, что мы уже многого достигли, не написав ни одной строчки кода. Возможности ЭТ исчерпаны, и мы переходим в окно проекта для написания кода.
32
Типы данных, переменные, константы
9. Вернитесь в режим конструктора и дважды щелкните по элементу Lbl1. В среде программирования VBA раскроется окно со строчками
Private Sub Lbl1_Click()
End Sub
10. Объявим внутри этой процедуры строковую переменную с именем bukva. Поэтому после первой строки с названием процедуры вторая строчка нашего кода будет такой
Dim bukva As String
11. Перенесем значение из ячейки В4 в переменную bukva
bukva = Cells(4, 2)
12. Добавим в элемент Lbl1 этот символ к тем, что уже там были. Код будет таким
Lbl1.Caption = Lbl1.Caption + bukva
13. Проверяем правильность набора кода
Private Sub Lbl1_Click() Dim bukva As String bukva = Cells(4, 2)
Lbl1.Caption = Lbl1.Caption + bukva End Sub
14. Программа готова. Теперь для работы приложения достаточно, вернувшись в электронную таблицу и не забыв отключить режим конструктора, перемещая ползунок полосы прокрутки выбрать в ячейке B4 необходимую букву и щелкнуть по элементу Lbl1. Повторяя многократно эту операцию можно сформировать целое слово.
Заметим, что для удаления набранного слова достаточно использовать еще один объект — Кнопку, а в качестве кода в процедуре, срабатывающей при щелчке по этой кнопке, использовать строку
Lbl1.Caption = '' ''
Обратим Ваше внимание на то, что полоса прокрутки нам понадобилась для изменения числового значения в ячейке ЭТ. Если Вы хорошо знаете возможности Excel, то Вы догадаетесь, это за-
33
1. Основы VBA
мечательное свойство полосы прокрутки можно использовать достаточно эффективно и в других ситуациях.
Готовый вариант программы находится в файле «Полоса прокрутки» на прилагаемом к книге диске.
Основные конструкции языка
Наступила пора познакомиться с теми основными понятиями, приемами и методами, которыми пользуется любой программист, независимо от того, на каком языке он пишет. Начнем с конструкций языка или как еще говорят с алгоритмов. Само понятие алгоритма, широко употребляемое в среде программистов, означа- ет некий план работы для компьютера. При этом предполагается, что если компьютер (имеется в виду программа) выполнит этот план, то цель алгоритма будет достигнута. На сам алгоритм накладываются определенные условия — например, он должен учитывать «способности» компьютера, иметь конкретную цель и т. д. В программировании, в настоящее время выделились следующие группы алгоритмов — линейные, повторяющиеся, алгоритмы перехода и вложенные.
Линейные алгоритмы — это последовательность инструкций в программе, выполняемых последовательно друг за другом и не представляющие особого интереса. Те небольшие программки, которые мы с Вами создали в упражнениях, по своей структуре являются линейными.
Рассмотрим повторяющиеся алгоритмы или циклы. Циклы целесообразно применять в том случае, если одни и те же команды должны повторяться определенное количество раз или при достижении определенного условия. Например, при многократном сложении чисел, при рисовании не одной линии, а нескольких, при изменении свойств нескольких ячеек или значений целого ряда однотипных переменных (массива). Рассмотрим случай, когда возникла необходимость раскрасить несколько ячеек рабочего листа в красный цвет. Для определенности пусть это будут ячейки второго столбца, и закрашивать нужно начиная с третьей строки до десятой через одну ячейку. Используя макрос и справочную систему VBA, можно записать код для закраски ячейки 3 строки 2-го столбца —
Cells(3,2).Interior.Color = VbRed.
34
Основные конструкции языка
Для того чтобы применить эту команду к другим ячейкам этого же столбика, нужно знать строчку — начало, строчку — конец, и в процессе закрашивания знать номер строки, на которой находится закрашиваемая ячейка, то есть должен быть включен счетчик. При этом коде для закраски значение строки в должно меняться.
В данном случае мы знаем, сколько раз надо повторять команды, а также во время повторения команд хотим воспользоваться значением счетчика повтора, поэтому имеет смысл использовать конструкцию For...Next.
Конструкция For...Next
Синтаксис этой конструкции имеет следующий вид
For <счетчик> =< начало> To <конец> [Step <шаг>] [инструкции, которые должны повторяться] — тело цикла
Next [<счетчик>]
Применительно к нашему случаю эту инструкцию можно записать следующим образом
For K = 3 òî 10 step 2
Cells(K,2).Interior.Color = VbRed.
Next K
Когда программа дойдет до строчки For K = 3 òî 10 step 2, то переменной Ê будет присвоено значение 3. Затем будет выполнена команда закрашивания ячейки в третьей строке (Ê=3), После этого при выполнении команды Next K произойдет проверка — не стало ли Ê больше 10. Если этого не произошло, то Ê становится равным 3+2=5. Напомним, что 2 — это шаг. Затем опять выполняется команда закрашивания, но уже для ячейки пятой строки. То есть начинается циклическое выполнение команды изменения цвета. Это выполнение будет продолжаться до тех пор, пока Ê не превысит значение 10.
Как видите, в инструкции For...Next содержатся следующие элементы:
<Счетчик>Это обязательный параметр. Здесь ставится имя числовой переменной, которая будет изменяться от начального до конечного значения с определенным шагом.
<Начало> Это также обязательный параметр. Это может быть число или имя какой-то переменнойю.
<Конец> тоже обязательный параметр и тоже может быть числом или именем переменной. Это значение должно отличаться от <начала>
35
1. Основы VBA
<Øàã> Необязательный параметр. Показывает значение, на которое изменяется счетчик при каждом выполнении тела цикла — числовое значение или имя числовой переменной. Если это значение не задано, по умолчанию шаг равен единице.
инструкции, которые должны повторяться — Необязательный параметр. Одна или несколько инструкций между For и Next, которые выполняются указанное число раз.
При использовании этой инструкции необходимо также учитывать, что аргумент <øàã> может быть как положительным, так и отрицательным. Цикл будет повторяться при положительном или нулевом øàãå ïîêà счетчик <= конец, а при отрицательном — пока
счетчик >= конец.
Изменение значения переменной счетчик внутри цикла усложняет чтение и отладку программы, но с другой стороны использование этой переменной внутри цикла совершенствует программу. Если предполагается по каким — либо причинам (условиям) досрочный выход из цикла, то внутри цикла можно вставить инструкцию Exit For. Как правило, эта инструкция часто применяется вместе с проверкой некоторого условия (например, If...Then). Эта инструкция передает управление команде, непосредственно следующей за командой Next. Допускается организация вложенных циклов For...Next (один цикл For...Next располагается внутри другого). Счетчик каждого цикла должен иметь уникальное имя. В качестве иллюстрации приведем пример, когда происходит закрашивание нескольких ячеек, расположенных на определенном участке таблицы.
Private Sub Cmd3_Click()
Range(''a1:r20'').Clear
For K = 3 To 10 Step 2
For j = 2 To 15 Step 3
Cells(K, j).Interior.Color = vbBlue
Next j
Next I
End Sub
Приведенные примеры реализованы в файле «Циклы.xls».
Конструкция Do...Loop
Теперь давайте познакомимся с конструкцией Do...Loop. Это конструкция повторяет команды до тех пор, пока выполняется (или не выполняется) какое — то определенное условие. Напри-
36
Основные конструкции языка
мер, необходимо закрашивать ячейки в каком либо столбике, на- чиная с третьей строки, пока не встретим ячейку с данными (текст или число). В одной из ячеек этого столбика набрано слово «Stop» Посмотрите на пример, в котором происходит закрашивание яче- ек 2 столбца, пока не встретится это слово. Пример оформим в виде таблицы, чтобы дать подробные пояснения.
Private Sub Cmd1_Click() |
Начало процедуры |
Dim Õ As String |
Объвляем х как строковую |
|
переменную |
Range(''a1:r50'').ClearFormats |
Очищаем группу ячеек |
|
от предыдущих закрашиваний |
|
и форматов. Текст из ячеек при этом |
|
не удаляются. |
Õ = '''' |
Переменная Õ «пуста» |
K = 2 |
Эта переменная будет играть роль |
|
счетчика. |
Do While Õ = '''' |
Ключевая строка конструкции |
|
Do Loop. Включает в себя условие, |
|
что переменная х должна быть пустой |
|
строкой. |
K = K + 1 |
Åñëè Õ пуста, то начинается |
|
выполнение команд внутри цикла |
|
и мы «вручную» увеличиваем счетчик |
|
на единицу. Закрашивание начнется |
|
с третьей строки. |
|
|
Cells(K, 2).Interior.ColorIndex = K |
Закрашиваем ячейку в строке |
|
с номером Ê. Цвет фона определяем |
|
через свойство ColorIndex (номер |
|
цвета). Теперь цвет зависит |
|
от значения Ê. |
Õ = Cells(I, 2) |
Считываем в Õ содержимое ячейки |
Loop |
Вторая ключевая строка — |
|
возвращение к началу цикла |
|
|
End Sub |
Конец процедуры |
|
|
Этот пример Вы тоже можете посмотреть в файле «Циклы». Особенность этого варианта в том, что цикл будет выполнять-
ся, если выполняется условие. В общем виде эта конструкция оформляется в программе следующим образом
37
1. Основы VBA
Do While [<условие>] [инструкции]
[Exit Do] [инструкции] Loop
 ðîëè <условия> используется любое строковое или числовое выражение, которое может принимать истинное или ложное зна- чение (True или False). Предлагаем примеры условий
X1 > 5
Y2 =< 2 — проверяется условие, что Y2 не больше 2
Z = 8
Ê <> 16 — проверяется условие, что K не равно 16. R > 5 and R < 26 — проверяется условие, что 5<R<26
A1 =< 3 or A1 >= 6 — проверяется условие, что A1 не больше 3 или не меньше 6
 ðîëè [инструкций] выступают команды, которые должны выполняться внутри цикла. Обратите внимание, что внутри цикла может быть размещена строка [Exit Do], исполнение которой приводит к немедленному выходу из цикла.
При создании подобного цикла необходимо позаботиться о таких инструкциях выполнение которых приведет к изменению условий внутри цикла, так чтобы цикл мог когда — то прекратиться.
Åñëè условие не указывать, то цикл будет бесконечным и программа «зависает». Для прерывания «зависшей» программы необходимо нажать сочетание клавиш <Ctrl>+<Break>.
Если в первой строке конструкции вместо While набрать Until, то цикл будет выполняться, пока не выполняется условие. Нижеприведенный пример отличается от предыдущего тем, что в нем используется конструкция Do Until...Loop.
Private Sub Cmd2_Click() Dim x As String Range(''a1:r50'').ClearFormats x = ''''
K = 2
Do Until x = ''Stop'' K = K + 1
Cells(I, 3).Interior.ColorIndex = K x = Cells(K, 3)
Loop
38
Основные конструкции языка
End Sub
Кроме того, отметим, что VBA допускает проверку условия не в первой строке конструкции, а в последней. Тогда синтаксис этой конструкции выглядит следующим образом
Do [инструкции] [Exit Do] [инструкции]
Loop [{While | Until} условие]
Конструкция If...Then...Else
Переходим к алгоритму условного перехода. Этот алгоритм применяется в тех случаях, когда по ходу программы возникает необходимость или возможность выбора дальнейших инструкции для выполнения. Например, если подкоренное выражение стало отрицательным, то вычисление корня производить нельзя или когда сумма налога оказалась выше начислений.
Синтаксис этой конструкции таков
If <условие> Then [инструкции] [Else инструкции для else]
Допускается также использование блоковой формы синтаксиса:
If <условие> Then [инструкции] [Else [инструкции_else]] End If
В синтаксисе конструкции If...Then...Else элемент <условие> такой же, как и в предыдущей конструкции и он является обязательным.
[инструкции] — набор команд, которые должны выполняться, если условие выполняется. Это необязательный параметр в блоковый форме; и обязательный в строчной форме без предложения Else. Одна или несколько инструкций, разделяемых двоеточиями; выполняются, если условие имеет значение True.
Инструкции_else (Необязательный параметр). Одна или несколько команд, которые будут выполняться в программе, если условие не выполняется. Простую однострочную форму рекомендуется использовать для коротких, простых проверок, когда инструкции состоят из одной команды, блочная форма обеспечивает более
39
1. Основы VBA
структурированный подход и большую гибкость по сравнению с однострочной формой. Блочная форма обычно проще для чтения, обработки и отладки. Последняя строка в блочной форме — End If.
Предложение Else в обеих формах записи не являются обязательными. Допускаются вложенные блоки инструкций If; то есть блоки If, содержащиеся в других блоках.
Нижеприведенный пример, отличается от предыдущего тем, что прекращается выполнение цикла, если параметр К стал больше 7. Это обеспечивается строкой кода If K = 8 Then Exit Do.
Private Sub Cmd3_Click() Dim x As String Range(''a1:r50'').ClearFormats x = ''''
K = 2
Do Until x = ''Stop'' K = K + 1
Cells(I, 4).Interior.ColorIndex = K If K = 8 Then Exit Do
x = Cells(K, 4) Loop
End Sub
Предлагаем познакомиться с примером, где допущена ошибка и цикл не будет завершен, потому что ячейка с текстом будет пропущена из-за того что параметр К изменяется с шагом 2. Для аварийного выхода из цикла (в качестве демонстрации используется также строка с Exit Do
Private Sub Cmd4_Click() Dim x As String Range(''a1:r50'').ClearFormats x = ''''
K = 2
Do While x = ''''
K = K + 2
Cells(K, 5).Interior.ColorIndex = K x = Cells(K, 5)
If K > 40 Then Exit Do Loop
40
