Лабораторная работа 16.
Синтаксические конструкции языка VBA.

horizontal rule

Задание

horizontal rule

Задание

  Процедуры VBA.

bullet

Процедура Sub - аналог подпрограммы procedure в языке pascal (создается при автоматическом создании макроса).
Sub имя ([аргументы])
    Инструкции
End Sub

bullet

Процедура Function - аналог подпрограммы function в языке pascal.
Function Имя ([аргументы]) [As Тип]
    Инструкции
    Имя = выражение
End Function

Если опущена конструкция As Тип, то по умолчанию возвращается значение Variant.

bullet

Процедура Property используется для ссылки на свойство объекта. Данный тип процедур применяется для установки или получения значения пользовательских свойств форм и модулей. Процедуры Property облегчают хранение и применение информации, если использовать их сначала для сохранения в свойстве этой информации, а затем для ее чтения. Например, свойство CurrentUser может содержать имя текущего пользователя вашего приложения. Если же в дальнейшем потребуется использовать это имя, то можно прочитать значение свойства CurrentUser.

Инструкции.

Инструкции рекомендуется располагать по одной в каждой строке, допускается размещать несколько инструкций в одной строке, отделяя их двоеточием. Если строка программы слишком длинна, то при указании выходящей за пределы экрана части инструкции используется один из следующих вариантов: 1) продолжают печатать на той же строке, допуская чтобы часть инструкции находилась за пределами видимости; 2) вводят символ продолжения строки - подчеркивание '_', затем нажимают Enter и продолжают ввод на новой строке.

VBA позволяет свободно использовать в программе пробелы. Это означает, например, что можно оставлять пустые строки, чтобы визуально разделить процедуру на логически связанные части, а также для установки отступов от начала строки.

Управляющие инструкции

bullet

Инструкция If

If условие Then [инструкции] [Else инструкции_else]
 
  Пример:
If Sales > 15000000 Then Commission = 0.08 Else Commission = 0.05

bullet

Многострочная инструкция 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

bullet

Инструкция 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

bullet

Инструкция 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 условие

Цикл выполняется пока условие ложно, проверка условия осуществляется после выполнения тела цикла. Выход из цикла происходит в том случае, когда условие становится истинным.

bullet

Инструкция 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

bullet

Инструкция While...Wend

Инструкция While...Wend является разновидностью инструкции Do...Loop с синтаксисом 1.

  While [условие]
    инструкции
Wend

Замеч.: в этом цикле не используется инструкция Exit Do

bullet

Цикл For...Next

Эта инструкция позволяет выполнить набор утверждений заданное число раз.

  For счетчик = начало To конец [Step шаг]
    [инструкции]
Next [счетчик]

Параметр счетчик - это числовая переменная, которая автоматически увеличивается после каждого повтора. Начальное значение счетчика равно параметру начало, а конечное - параметру конец.

bullet

Цикл 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 для стандартных семейство объектов заключается в том, что перемещение на требуемый элемент выполняется намного быстрее, чем если фактически выделять части всего документа. Кроме того, выделенный текст не изменяется, поэтому не требуется запоминать текущую позицию, чтобы в конце макроса возвратиться в нее обратно.

bullet

Инструкция 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

bullet

Безусловный выход из блока

Exit Do  - выход из цикла Do..Loop

Exit For  - выход из цикла For..Next или For Each..Next

Exit Function  - выход из функции, в которой имеется данная инструкция

Exit Property  - выход из процедуры Property, в которой имеется данная инструкция

Exit Sub  - выход из процедуры, в которой имеется данная инструкция

 

Контрольные вопросы и задания

  1. Напишите синтаксис процедуры Function?
  2. Какие управляющие инструкции Вы знаете?
  3. Команда передачи управления следующему за циклом оператору?
  4. Напишите синтаксис цикла с заданным количеством итераций?
  5. Команда выхода из процедуры?
  6. Назначение инструкции With?