Основы программирования на VBA для Microsoft Excel. Учебное пособие
.pdfПеременные и константы, объявленные как Public, сохраняют свое значение и вне блока кода, в котором они определены, т. е. до конца выполнения программы.
Переменные и константы, объявленные как Static, сохраняют свое значение и между вызовами процедур.
Переменные и константы, объявленные без ключевых слов Public, Private, Static, сохраняют свое значение согласно месту их объявления (описания).
Операторы
Законченным предложением языка программирования является оператор, в составе которого может быть несколько выражений, заключенных в круглые скобки и соединенных знаками операций. В операторе выражение может быть заменено его значением, напри-
мер, с=2.5.
Оператор VBA – это законченная конструкция языка, распознаваемая компилятором и определяющая какое-либо действие либо описание переменных, констант или функций. Операторы представляют собой отдельные неделимые предложения языка. Исходный текст программы состоит из операторов.
Операторы выполняются в порядке их расположения в программе, исключение составляют управляющие операторы, которые могут предписывать иной порядок выполнения.
В исходном тексте программы операторы обычно представляют собой отдельные строки, хотя допустима и запись нескольких операторов в одной строке. В этом случае операторы разделяются двоеточием. Обычно так поступают с короткими операторами присваивания или объявления переменных, например:
Dim X, Y As Integer: X=2: Y=3
В этой строке записано три оператора, первый из которых является оператором объявления переменных X и Y, а остальные – операторами присвоения.
Если оператор не умещается на одной строке, то в конце этой строки ставится пробел и знак подчеркивания. Оставшаяся часть оператора записывается в следующей строке. Перенос на другую строку не допускается из выражений, заключенных в скобки. Пример оператора, записанного в виде двух строк:
Z=X+ _ Y
51
Оператор может состоять из одного единственного ключевого слова, например Beep, или любой комбинации ключевых слов, переменных, операций, функций и других допустимых элементов, распознаваемых компилятором, например:
Z=(2+3)/2+sin(x)
Всю совокупность операторов можно подразделить на операторы описания и исполняемые операторы.
Операторы описания служат для описания переменных, констант или процедур, а также для задания типов данных.
Исполняемые операторы инициируют действие. Они могут выполнить функцию, организовать управление работой программы, например повторение или ветвление блоков программы. К ним относят операторы передачи управления, условные операторы и операторы циклов.
К исполняемым операторам относят и операторы присваивания, обеспечивающие присвоение переменной или константе конкретного значения. Например, оператор X=5 является оператором присваивания значения 5 переменной X.
Операторы передачи управления применяются редко, так как приводят к запутанности программы и тем самым способствуют появлению ошибок. К операторам передачи управления относятся оператор безусловного перехода GoTo, с помощью которого можно передать управление оператору, обозначенному специальной меткой. Например:
m: X=5
…
GoTo m
Метка отделяется от оператора двоеточием и ставится слева от него.
Операторы выбора
Операторы выбора служат для изменения хода вычислительного процесса в зависимости от значения некоторого условия. По этой причине их еще называют условными операторами.
В VBA есть два типа операторов выбора – это оператор типа If … Then и оператор Select Case. Первый из них осуществляет выбор одной из двух альтернатив, в зависимости от значения условия – Истина или Ложь. Второй является переключателем и реализует выбор одного из множества возможных альтернативных вариантов.
52
Оператор If … Then
Этот оператор имеет две формы записи – сокращенную и полную. Полная форма имеет вид:
If (условие) Then
первый блок операторов
Else
второй блок операторов
End If.
Если условие истинно, то выполняется оператор или операторы, следующие за ключевым словом Then (то). Если условие ложно, то выполняется оператор или операторы, следующие за ключевым словом Else (иначе).
При записи этого оператора соблюдается правило: выполняемые операторы располагаются на отдельных строках, причем первый блок операторов располагается между строками, содержащими ключевые слова Then и Else, а второй блок операторов – между строками с ключевыми словами Else и End If. Таким образом, для полной записи оператора требуется минимум пять строк.
Сокращенная форма отличается от полной тем, что в ней отсутствует ключевое слово Else:
If (условие) Then блок операторов
End If
Согласно этой форме если условие истинно, то выполняется оператор или операторы, следующие за ключевым словом Then. Если условие ложно, то выполняется оператор, следующий за End If.
Например, при выполнении фрагмента программы
If (X>0) Then
Y=X^2 End If Z=2
значение переменной X будет возведено в квадрат и результат присвоится переменной Y, если будет выполнено условие X>0. Если значение выражения X>0 окажется ложным, то оператор Y=X^2 выполняться не будет и управление будет передано оператору Z=2.
53
Оператор If … Then может иметь в своем составе другой оператор If … Then. Такие операторы называются вложенными друг в друга и применяются в тех случаях, когда требуется проверка не одного, а сразу двух условий.
Пример вложенного оператора If … Then: If X>1 Then
If X=2 Then
Y=X^2 Else
Y=X+2 End If
End If
Здесь при X=2 получим Y=4, а при X=3 получим Y=5.
Вложение может быть и многократным, если требуется проверка сразу нескольких условий. Здесь важно помнить, что очередная альтернатива Else относится к ближайшему оператору If, не имеющему ветви Else.
В VBA допускается также конструкция с использованием нескольких операторов If … Then, например:
If X>5 Then Y=X^2
ElseIf X>3 Then Y=X+1
Else Y=X-1
End If
Использование нескольких операторов If … Then позволяет проверить дополнительное условие при ложном исходном условии. Например, если X=4, то первое условие, X>5, дает значение False, а второе, X>3, дает значение True, и в результате получим значение Y=5. При X=2 получим Y=1. В отличие от других форм записи данная форма записи оператора имеет в своем составе ключевое слово ElseIf.
54
Оператор Select Case (переключатель)
Этот оператор позволяет сделать выбор одного варианта из множества альтернативных вариантов в зависимости от значения условного выражения. Пример:
Select Case X Case 1
Y="Один"
Case 60 To 80 Y="Хорошо"
Case Is < 60 Y="Удовлетворительно"
End Select
Как видно из примера, параметром Case может быть как конкретное значение, так и выражение, записанное с помощью операции отношения с ключевым словом To или Is.
Допускается вложенность инструкций Select Case. При этом каждой вложенной инструкции Select Case должна соответствовать инст-
рукция End Select.
Операторы цикла
Многократное выполнение одного и того же действия в программе можно записать в виде повторения одного и того же оператора. Однако такой прием возможен, если число повторов невелико. И даже в этом случае ухудшается читаемость программы и увеличивается ее объем.
Более изящно задачу многократного выполнения однотипных действий можно решить, применив специальную управляющую конструкцию под названием «цикл».
С помощью этой управляющей конструкции можно один раз прописать выполняемый оператор, указав число его повторов или определив это число по значению некоторого условия. В VBA есть оба типа циклов – это циклы со счетчиком и циклы с условием.
Циклы со счетчиком (цикл типа For … Next) используют, если известно число повторов. Это число заранее задают при описании цикла.
55
Циклы с условием используют, если некоторое действие требуется повторять до тех пор, пока выполняется некоторое условие или пока не будет выполнено определенное условие.
Условие в циклах может предшествовать выполнению действия или стоять после оператора, определяющего действие. В первом случае цикл называется циклом с предусловием, во втором случае – циклом с постусловием.
Операторы цикла со счетчиком
Для записи оператора цикла со счетчиком используются ключевые слова For и Next, определяющие соответственно начало и конец цикла. Пример оператора цикла со счетчиком:
For I=1 To 10 Step 2
Sum=Sum+5 Next
Этот цикл заменяет сразу пять операторов Sum=Sum+5, которые нужно было бы поместить в текст программы. В начале цикла определяется переменная – счетчик. В данном примере счетчику присвоено имя I и задано начальное значение 1 и конечное значение 10. Переменной Sum до выполнения цикла должно быть присвоено конкретное значение.
При каждом выполнении оператора Sum=Sum+5 значение счетчика увеличивается на 2. Величина приращения определяется параметром Step (шаг). Если этот параметр не указан, то по умолчанию шаг равен единице.
В данном примере переменная цикла будет последовательно принимать значения 1, 3, 5, 7, 9. Каждый раз при изменении значения счетчика это значение сравнивается с конечным значением. При превышении конечного значения счетчика происходит выход из цикла и управление передается оператору, следующему за циклом.
Цикл For … Next может быть прерван принудительно, при достижении некоторого условия: например, принудительное завершение будет выполнено, если в тело цикла поместить оператор:
If Sum>7 Then
Exit For End If
56
Для выполнения однотипных операций над каждым элементом некоторой совокупности данных, например, массива m, можно применить оператор:
For Each i In m m(i)=m(i) ^ 2
Next
С помощью этого оператора каждый элемент i массива m будет возведен в квадрат.
Аналогичные действия можно выполнить и над диапазоном ячеек электронной таблицы:
For Each i In Range("a1:a5")
Cells(i, 2).Value=Cells(i, 1).Value ^ 2 Next
Операторы цикла с условием
Оператор While … Wend. Отличительной особенностью этого цикла является наличие некоторого условия. Цикл выполняется до тех пор, пока условие дает значение True (Истина). Например, цикл:
While a <> 5 a=InputBox("Введите число: ")
Wend
будет выполняться до тех пор, пока не будет введена цифра 5. Этот цикл – типичный пример цикла с предусловием.
Операторы Do … Loop. Цикл типа Do … Loop предоставляет большие возможности и имеет две разновидности. Первая из них реализует цикл с предусловием, а вторая – с постусловием, причем обе обеспечивают выполнение цикла либо если условие истинно (используется слово While), либо если условие ложно (используется слово
Until).
Пример цикла с предусловием:
Do While a<>5 a=InputBox("Введите число: ")
Loop
57
Этот цикл работает точно так же, как и цикл While … Wend. Сначала проверяется условие a<>5, и если оно дает значение True (Истина), то выполняется оператор a=InputBox("Введите число: "). Таким образом, цикл будет выполняться до тех пор, пока условие a<>5 не примет значение False (Ложь).
Цикл с постусловием применяется, если требуется выполнить оператор хотя бы один раз, например:
Do
a=InputBox("Введите число: ") Loop While a<>5
Циклы с предусловием и циклы с постусловием можно реализовать и для случаев, когда требуется, чтобы условие было ложным. Для этого в конструкцию цикла включают слово Until.
Например, с ключевым словом Until можно реализовать цикл с предусловием:
Do Until a=5
a=InputBox("Введите число: ") Loop
Вэтом цикле условие проверяется до выполнения оператора a=InputBox("Введите число: "), и цикл работает до тех пор, пока условие a = 5 ложно.
Таким образом, если переменная a до выполнения цикла имела значение 5, то оператор присваивания не будет выполнен ни разу.
Вцикле с постусловием:
Do
a=InputBox("Введите число: ")
Loop Until a=5
также используется ключевое слово Until, и цикл работает до тех пор, пока условие a=5 дает значение False (Ложь). Проверка условия проводится после выполнения оператора a=InputBox("Введите число: "), поэтому оператор будет выполнен хотя бы один раз.
Преждевременно прервать выполнение цикла Do … Loop можно с помощью оператора Exit Do.
58
Вложенные циклы
Простые циклы могут быть вложены один в другой и образовывать таким образом сложные циклы. При описании вложенных циклов необходимо учитывать следующие ограничения:
нельзя войти во внутренний цикл, минуя вход внешнего цикла;
не допускается повтор имен параметров простых циклов в составе сложного цикла;
окончание внутреннего цикла должно предшествовать окончанию внешнего цикла.
Процедуры и функции
Подпрограммы на VBA подразделяются на процедуры и функции. Все они, если не являются встроенными, требуют описания.
В структуру одной процедуры или функции запрещается включать описание других процедур или функций. Вызов процедуры или функции можно производить из других процедур или функций.
Описания процедур и функций общего назначения хранятся в стандартном модуле и могут быть многократно использованы как в пределах одного проекта, так и в других проектах. Использование их позволяет избегать многократного повторения одних и тех же операторов в программе.
Функция – это определенным образом оформленная часть программы, которая выполняет действия (операторы), входящие в ее состав, и возвращает результат выполненных действий в место вызова. Возвращается только одно значение. Именно поэтому вызов функции можно использовать в правой части оператора присваивания.
Функции записывают в стандартный модуль. При отсутствии этого модуля его следует добавить в проект командой Insert/ Module. Добавленный стандартный модуль отобразится в окне проводника проекта. Если это первый модуль, то его имя по умолчанию будет Module1.
Двойной щелчок по значку модуля в проводнике проекта позволяет открыть окно редактора кода, куда и следует записать исходный текст функции.
Пример описания функции, предназначенной для возведения переданного ей числа в квадрат:
Public Function F(x As Integer) As Integer x=x^2
f=x
End Function
59
Определение функции может начинаться с необязательного ключевого слова Public, Private или Static, за этими словами следует имя функции и список параметров, заключенный в круглые скобки. При отсутствии параметров указываются только пустые скобки. После списка параметров определяется тип возвращаемого результата. Заканчивается определение функции ключевыми словами End Function.
Тело функции состоит из операторов x=x^2 и f=x. Первый из них возводит значение переменной x во вторую степень, а второй – присваивает результат выполненного действия имени функции. Значение функции возвращается через ее имя.
При описании процедур и функций в круглых скобках указываются параметры, которые называются формальными. Фактические параметры указываются в операторах их вызова. При выполнении оператора вызова происходит замещение формальных параметров фактическими.
Перед именами параметров (аргументов) функции можно использовать ключевые слова ByVal и ByRef, которые указывают способ их передачи. Слово ByVal означает, что параметр передается по значению, т. е. функция будет иметь дело не с самой переменной, а с ее копией, изменение которой не приведет к изменению переменной-ори- гинала.
Ключевое слово ByRef означает, что параметр передается по ссылке, т. е. функция будет иметь дело с самой переменной. Значения переменных, передаваемых по способу ByRef, могут быть изменены внутри функции. По умолчанию, т. е. при отсутствии в описании ключевых слов ByVal или ByRef, аргумент передается по ссылке.
Вызов функции может быть осуществлен из правой части оператора присваивания, например Y= F(5). В данном примере переменной Y будет присвоено значение 25, вычисленное с помощью функции F.
Ключевые слова Public и Private определяют область видимости функции и возможность ее использования в различных частях программы. Они могут применяться и в определениях переменных и констант, где также определяют права доступа.
Слово Private задает область видимости на уровне модуля, и функция может быть вызвана на выполнение только из процедур или функций того модуля, в котором она определена. Если права доступа при определении функции не указаны, то функция приобретает права дос-
тупа Public.
60
