Лабораторная работа 16.
Синтаксические конструкции языка VBA.
Процедуры VBA.
Процедура Sub - аналог подпрограммы
procedure в языке pascal
(создается при автоматическом создании макроса).
Sub имя ([аргументы])
Инструкции
End Sub
Процедура Function - аналог
подпрограммы function в языке pascal.
Function Имя ([аргументы])
[As Тип]
Инструкции
Имя = выражение
End Function
Если опущена конструкция As Тип, то
по умолчанию возвращается значение Variant.
Процедура Property используется для ссылки на свойство объекта. Данный тип процедур применяется для установки или получения значения пользовательских свойств форм и модулей. Процедуры Property облегчают хранение и применение информации, если использовать их сначала для сохранения в свойстве этой информации, а затем для ее чтения. Например, свойство CurrentUser может содержать имя текущего пользователя вашего приложения. Если же в дальнейшем потребуется использовать это имя, то можно прочитать значение свойства CurrentUser.
Инструкции.
Инструкции рекомендуется располагать по одной в каждой строке, допускается размещать несколько инструкций в одной строке, отделяя их двоеточием. Если строка программы слишком длинна, то при указании выходящей за пределы экрана части инструкции используется один из следующих вариантов: 1) продолжают печатать на той же строке, допуская чтобы часть инструкции находилась за пределами видимости; 2) вводят символ продолжения строки - подчеркивание '_', затем нажимают Enter и продолжают ввод на новой строке.
VBA позволяет свободно использовать в программе пробелы. Это означает, например, что можно оставлять пустые строки, чтобы визуально разделить процедуру на логически связанные части, а также для установки отступов от начала строки.
Управляющие инструкции
Инструкция If
If условие Then [инструкции]
[Else инструкции_else]
Пример: If Sales > 15000000 Then Commission = 0.08 Else Commission
= 0.05
Многострочная инструкция If
If условие Then [инструкции]
[ElseIf условие-n Then
[инструкции_elseif]...
[Else
[инструкции_else]]
End If
Пример:
If Sales > 15000000 Then
Commission = 0.08
Rating = "Отлично"
ElseIf Sales > 12000000 Then
Commission = 0.07
Ratin = "Хорошо"
Else
Commission = 0.05
Rating = "Средне"
End If
AnnualSales = AnnualSales + Sales
Замеч. В многострочной структуре инструкции If, которые выполняются в случае истинности условия, нельзя располагать на той же строке, что и ключевое слово Then
Инструкция Select Case
Select Case выражение
[Case списокВыражений-n
[инструкции-n]]...
[Case Else
[инструкции-else]]
End Select
Параметр выражение - любое числовое или строковое выражение. Вместо вычисления логического условия выполняется сравнение значения выражения с каждой из величин, заданных параметром списокВыражений-n. В инструкции может быть произвольное число блоков Case. Если ни одно из условий не является истинным, то выполняются инструкции блока Case.
Пример:
Select CAse StateOfResidence
Case "Рязань" , "Севастополь"
SalesTax = 525
Case "Киев"
SalesTax = 450
Case "Минск"
SalesTax = 650
Case Else
SalesTax = 0
End Select
Select Case UnitsOrders
Case 1 To 10
Discount = 0
Case 11 To 19
Discount = 0.05
Case Is >=20
Discount = 0.10
End Select
Инструкция Do...Loop
Инструкция Do...Loop имеет четыре варианта синтаксиса:
Синтаксис 1: Do While...Loop
Do While условие
[инструкции]
Loop
Цикл выполняется пока условие истинно, проверка условия осуществляется перед выполнением тела цикла. Выход из цикла происходит в том случае, когда условие становится ложным.
Синтаксис 2: Do Until...Loop
Do Until условие
[инструкции]
Loop
Цикл выполняется пока условие ложно, проверка условия осуществляется перед выполнением тела цикла. Выход из цикла происходит в том случае, когда условие становится истинным.
Синтаксис 3: Do...Loop While...
Do
[инструкции]
Loop While условие
Цикл выполняется пока условие истинно, проверка условия осуществляется после выполнения тела цикла. Выход из цикла происходит в том случае, когда условие становится ложным.
Синтаксис 4: Do ...Loop Until...
Do
[инструкции]
Loop Until условие
Цикл выполняется пока условие ложно, проверка условия осуществляется после выполнения тела цикла. Выход из цикла происходит в том случае, когда условие становится истинным.
Инструкция Exit Do
Инструкция Exit Do позволяет безусловно передать управление команде, которая следует за последней командой цикла.
Пример:
Counter = 99
Do Until Counter <= 0
If Counter > 50 Then
MsgBox "Начальное
значение больше максимального допустимого",_
"Ошибка
ввода"
Exit Do
End If
Call MySubroutine
Counter = Counter - 2
Loop
Инструкция While...Wend
Инструкция While...Wend является разновидностью инструкции Do...Loop с синтаксисом 1.
While [условие]
инструкции
Wend
Замеч.: в этом цикле не используется инструкция Exit Do
Цикл For...Next
Эта инструкция позволяет выполнить набор утверждений заданное число раз.
For счетчик =
начало To конец [Step
шаг]
[инструкции]
Next [счетчик]
Параметр счетчик - это числовая переменная, которая автоматически увеличивается после каждого повтора. Начальное значение счетчика равно параметру начало, а конечное - параметру конец.
Цикл For Each...Next
Эта инструкция позволяет повторить выполнение группы инструкций для каждого элемента массива и семейства.
For Each элемент In
группа
[инструкции]
Next [элемент]
Пример: Макрос,
который просматривает каждый абзац документа Word,
определяет, отформатирован ли он обычным стилем или нет, и вычисляет процент
обычных абзацев от общего количества.
Sub NormalParagraphs ()
For Each p in ActiveDocument.Paragraphs
ParaCount = ParaCount + 1
If p.Style = "Обычный"
Then
NormalCount =
NormalCount + 1
End If
Next p
NormalPct = NormalCount / ParaCount * 100
MsgBox Format(NormalPct, "0.0%"
End Sub
В данном макросе используется стандартное семейство абзацев, которое имеется в любом документе Word. У каждого абзаца есть свойства, например свойство Style, являющееся названием стиля этого абзаца.
Преимущество использования цикла For Each...Next для стандартных семейство объектов заключается в том, что перемещение на требуемый элемент выполняется намного быстрее, чем если фактически выделять части всего документа. Кроме того, выделенный текст не изменяется, поэтому не требуется запоминать текущую позицию, чтобы в конце макроса возвратиться в нее обратно.
Инструкция With...End With
Строго говоря, инструкция With...End With не является управляющей, т.к. она не изменяет порядка выполнения команд, не вызывает циклического выполнения группы команд или безусловный переход. Однако данная инструкция часто используется в циклах, облегчает восприятие текста программы и ускоряет процесс разработки.
Большая часть действий в VBA производится с использованием объектов, точнее методов и свойство объектов приложений Office. В VBA имя объекта отделяется от его методов и свойств с помощью точек. Это часто приводит к затрудненному восприятию текста программы, т.к. приходится многократно повторяться при указании свойств и методов одного и того же объекта.
В следующем примере описывается использование точек при обозначении некоторых свойств объекта Selection (выделенный текст или область ячеек).
Пример:
Selection.TypeText Text:=UserName
Selection.TypeParagraph
Selection.Font.Italic = True
Selection.Font.Bold = True
Selection.TypeText Text:=UserTitle
Selection.Font.Italic = False
Selection.Font.Bold = False
Selection.TypeParagraph
Инструкция With..End With позволяет непосредственно работать со свойствами и методами объекта, не повторяя его имя в каждой инструкции.
With объект
[инструкции]
End With
Пример использования With..End With:
With Selection
.TypeText Text:=UserName
.TypeParagraph
With Font
.Italic = True
.Bold = True
End With
.TypeText Text:=UserTitle
With Font
.Italic = False
.Bold = False
End With
.TypeParagraph
End With
Безусловный выход из блока
Exit Do - выход из цикла Do..Loop
Exit For - выход из цикла For..Next или For Each..Next
Exit Function - выход из функции, в которой имеется данная инструкция
Exit Property - выход из процедуры Property, в которой имеется данная инструкция
Exit Sub - выход из процедуры, в которой имеется данная инструкция