Инструкция If...Then...Else выполняет определенные инструкции или наборы инструкций в зависимости от значения условия. Допускаются многократно вложенные инструкции If...Then...Else, имеющие столько уровней вложения, сколько потребуется. Однако для облегчения чтения программы вместо многократно вложенных инструкций If...Then...Else иногда предпочтительнее использовать инструкцию Select Case.
Выполнение инструкций, когда условие имеет значение True
Для выполнения только одной инструкции, когда условие имеет значение True, используется однострочный синтаксис инструкции If...Then...Else. Ниже приводится пример однострочного синтаксиса без ключевого слова Else.
Sub FixDate()
myDate = #2/13/95#
If myDate < Now Then myDate = Now
End Sub
Для выполнения нескольких строк программы используется многострочный синтаксис. Этот синтаксис содержит инструкцию End If как показано в следующем примере:
Sub AlertUser(value as Long)
If value = 0 Then
AlertLabel.ForeColor = "Красный"
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
End If
End Sub
Выполнение одних инструкций, когда условие истинно, и других - когда ложно
Инструкция If...Then...Else используется также для задания двух блоков исполняемых инструкций: один блок выполняется, если условие имеет значение True, а другой - если оно имеет значение False.
Sub AlertUser(value as Long)
If value = 0 Then
AlertLabel.ForeColor = vbRed
AlertLabel.Font.Bold = True
AlertLabel.Font.Italic = True
Else
AlertLabel.Forecolor = vbBlack
AlertLabel.Font.Bold = False
AlertLabel.Font.Italic = False
End If
End Sub
Проверка второго условия, если первое условие имеет значение False
Инструкция ElseIf добавляется к If...Then...Else для проверки второго условия, если первое условие имеет значение False. Например в следующей процедуре Function вычисляется премия на основе оценки проделанной работы. Инструкция, следующая за Else, выполняется, если условия во всех инструкциях If и ElseIf имеют значения False.
Function Bonus(performance, salary)
If performance = 1 Then
Bonus = salary * 0.1
ElseIf performance = 2 Then
Bonus = salary * 0.09
ElseIf performance = 3 Then
Bonus = salary * 0.07
Else
Bonus = 0
End If
End Function
Использование скобок в программе
Процедуры Sub, встроенные инструкции и некоторые методы не возвращают значений, и поэтому аргументы не заключаются в скобки. Например:
MySub "stringArgument", integerArgument
Процедуры Function, встроенные функции и некоторые методы возвращают значения, которые не используются. Если возвращаемое значение игнорируется, скобки не ставятся, и функция вызывается так же, как процедура Sub: скобки опускаются, перечисляются все аргументы, и функция не присваивается переменной. Например:
MsgBox "Конец задачи!", 0, "Список задач"
Чтобы получить возвращаемое значение функции, надо заключить аргументы в скобки, как показано в следующем примере.
Answer3 = MsgBox("Вам нравится Ваша зарплата?", 4, "Question 3")
Инструкция в процедурах Sub или Function может передавать значения вызываемой процедуре с помощью именованных аргументов. Правила использования скобок применимы как при наличии, так и при отсутствии именованных аргументов. Если используются именованные аргументы, они перечисляются в любом порядке, и необязательные аргументы опускаются. За именованным аргументом всегда следует двоеточие со знаком равенства (:=), а затем значение аргумента
В следующем примере вызывается функция MsgBox с помощью именованных аргументов, но возвращаемое значение не используется:
MsgBox Title:="Список задач", Prompt:="Конец задачи!"
В следующем примере вызывается функция MsgBox с помощью именованных аргументов. Возвращаемое значение присваивается переменной answer3:
answer3 = MsgBox(Title:="Question 3", _
Prompt:="Вам нравится Ваша зарплата?", Buttons:=4)
Инструкция Select Case может служить альтернативой инструкции ElseIf в If...Then...Else при оценке одного выражения, которое имеет несколько возможных значений. В то время как If...Then...Else для каждой инструкции ElseIf оценивает разные выражения, инструкция Select Case оценивает выражение только один раз, в начале управляющей структуры.
В следующем примере Select Case оценивает аргумент performance, который передается в процедуру. Следует отметить, что каждая инструкция Case несколько значений, диапазон значений или комбинацию значений и операторов сравнения. Необязательная инструкция Case Else выполняется, если Select Case не находит подходящего значения ни в одной из инструкций Case.
Function Bonus(performance, salary)
Select Case performance
Case 1
Bonus = salary * 0.1
Case 2, 3
Bonus = salary * 0.09
Case 4 To 6
Bonus = salary * 0.07
Case Is > 8
Bonus = 100
Case Else
Bonus = 0
End Select
End Function
Инструкция With позволяет указывать объект или определяемый пользователем тип данных только один раз для последовательности инструкций. Инструкция With ускоряет выполнение процедур и помогает избежать повторного задания имени объекта.
В следующем примере диапазон ячеек заполняется числовым значением 30, затем устанавливается полужирный шрифт и для внутренней области ячеек задается желтый цвет.
Sub FormatRange()
With Worksheets("Sheet1").Range("A1:C10")
.Value = 30
.Font.Bold = True
.Interior.Color = RGB(255, 255, 0)
End With
End Sub
Для увеличения эффективности программы возможно создание вложенных инструкций With. В следующем примере в ячейку A1 вставляется формула, и затем форматируется шрифт.
Sub MyInput()
With Workbooks("Book1").Worksheets("Sheet1").Cells(1, 1)
.Formula = "=SQRT(50)"
With .Font
.Name = "Arial"
.Bold = True
.Size = 8
End With
End With
End Sub
Правила присвоения имен в языке Visual Basic
При присвоении имен процедурам, константам, переменным, и аргументам в модулеVisual Basic используются следующие правила:
Имена должны начинаться с буквы.
Имя не может содержать пробел, точку (.), восклицательный знак (!) или символы @, &, $, #.
Имена не должны содержать более 255 символов.
Как правило, не следует использовать имена, совпадающие с названиями функций, инструкций, и методов языка Visual Basic, так как при этом прекращается выделение в тексте одноименных ключевых слов языка. Чтобы использовать встроенные функции языка, инструкции или методы, имена которых конфликтуют с присвоенным пользователем именем, их необходимо явно указывать. Для этого перед именем встроенной функции, инструкции или метода, должно стоять имя связанной с ними библиотеки типов. Например, если имеется переменная с именем Left, то функция Left должна вызываться как VBA.Left.
Не допускается использование повторяющихся имен на одном уровне области определения. Нельзя, например, описать две переменных с именем age в одной процедуре. Однако описание личной переменной age и переменной уровня процедуры age внутри одного модуля допустимо.
Примечание. В языке Visual Basic не различаются строчные и прописные буквы, однако в инструкции описания сохраняются прописные буквы.
Язык Visual Basic позволяет создавать новые объекты и загружать существующие объекты из многих приложений Microsoft. Другие приложения также могут предоставлять объекты, которые пользователь может создавать с помощью Visual Basic. Дополнительные сведения содержатся в документации приложения.
Для создания нового объекта или получения существующего объекта из другого приложения используются функции CreateObject и GetObject:
' Запуск Microsoft Excel и создание нового листа.
Set ExcelWorksheet = CreateObject("Excel.Sheet")
' Запуск Microsoft Excel и открытие существующего листа.
Set ExcelWorksheet = GetObject("SHEET1.XLS")
' Запуск Microsoft Word.
Set WordBasic = CreateObject("Word.Basic")
Большинство приложений предоставляют также методы Exit или Quit, которые закрывают приложение, независимо от того отображается оно на экране или нет. Дополнительные сведения по объектам, методам и свойствам, предоставляемым приложением содержатся в документации по приложению.
Некоторые приложения позволяют использовать ключевое слово New для создания объекта любого класса, который существует в библиотеке типов. Например:
Dim X As New Field
В данном случае Field является примером класса из библиотеки типов доступа к данным. Новый экземпляр объекта Field создается с помощью этого синтаксиса. Информация о том, какие классы объектов могут быть созданы таким образом, содержится в документации по приложению.
Процедура Function представляет собой последовательность инструкций языка Visual Basic, ограниченных инструкциями Function и End Function. Процедура Function подобна процедуре Sub, однако в отличие от последней она возвращает значения. Процедура Function может получать аргументы, как например константы, переменные, или выражения, передаваемые ей вызывающей процедурой. Если процедура Function не имеет аргументов, ее инструкция Function должна содержать пустые скобки. Возврат значения осуществляется путем его присвоения имени функции в одной или нескольких инструкциях процедуры.
В следующем примере функция Celsius пересчитывает градусы Фаренгейта в градусы Цельсия. Когда функция вызывается процедурой Main, переменная, содержащая значение аргумента, передается функции. Результат вычислений возвращается вызывающей процедуре и выводится в окно сообщения.
Sub Main()
temp = Application.InputBox(Prompt:= _
"Введите температуру в градусах Фаренгейта.", Type:=1)
MsgBox "Температура равна " & Celsius(temp) & " градусов Цельсия."
End Sub
Function Celsius(fDegrees)
Celsius = (fDegrees - 32) * 5 / 9
End Function
Процедура Property представляет собой последовательность инструкций языка Visual Basic, которые позволяют программисту создавать собственные свойства и оперировать с ними.
Процедуры Property создают допускающие только чтение свойства для форм, стандартных модулей и модулей класса.
Процедуры Property следует использовать вместо переменных Public в программе, которая должна выполняться после задания значение свойства.
В отличие от переменных Public процедуры Property могут иметь справочные строки, присвоенные им в окне Просмотр объектов.
Когда создается процедура Property, она становится свойством модуля, содержащего эту процедуру. В языке Visual Basic имеются три следующих типа процедур Property:
Процедура |
Описание |
Property Let |
Присваивает значение свойству. |
Property Get |
Возвращает значение свойства. |
Property Set |
Задает ссылку на объект. |
Синтаксис процедуры Property :
[Public | Private] [Static] Property имя_свойства_ [(список_аргументов)] [As тип]
инструкции
End Property
Процедуры Property обычно используются попарно: Property Let с Property Get и Property Set с Property Get. Описание одной процедуры Property Get подобно описанию свойства, доступного только для чтения. Использование всех трех процедур Property вместе полезно только для переменных Variant, так как только могут содержать как объект, так и другую информацию о типах данных. В отличие от Property Let процедура Property Set предназначена для работы с объектами.
Обязательные аргументы описания процедур Property представлены в следующей таблице:
Процедура |
Синтаксис описания |
Property Get |
Property Get имя(1, :, n) As тип |
Property Let |
Property Let имя(1, :,,,, n, n+1) |
Property Set |
Property Set имя(1, :, n, n+1) |
Первый аргумент и все следующие вплоть до последнего (1, :, n) должны иметь одно и то же имя и тип данных во всех одноименных процедурах Property.
Описание процедуры Property Get имеет на один аргумент меньше, чем связанные описания Property Let и Property Set. Тип данных процедуры Property Get должен быть тем же самым, что и тип последнего аргумента (n+1) в связанных описаниях Property Let и Property Set. Например, если описывается следующая процедура Property Let, в описании Property Get должны использоваться аргументы с тем же самым именем и типом данных, как аргументы в процедуре Property Let.
Property Let Names(intX As Integer, intY As Integer, varZ As Variant)
'Выполняемая инструкция.
End Property
Property Get Names(intX As Integer, intY As Integer) As Variant
'Выполняемая инструкция.
End Property
Тип данных последнего аргумента в описании Property Set должен быть или объектным типом или Variant.
Sub Процедура Sub представляет собой последовательность инструкций языка Visual Basic, ограниченных инструкциями Sub и End Sub, которая выполняет действия, но не возвращает значение. Процедура Sub может получать аргументы, как например константы, переменные, или выражения, передаваемые ей вызывающей процедурой. Если процедура Sub не имеет аргументов, инструкция Sub должна содержать пустые скобки.
В следующей процедуре Sub содержатся комментарии, объясняющие каждую строк.
' Описывает процедуру с именем GetInfo
' Эта процедура Sub не имеет аргументов
Sub GetInfo()
' Описывает строковую переменную с именем answer
Dim answer As String
' Присваивает переменой answer возвращаемое значение функции
answer = InputBox(Prompt:="Как Ваше имя?")
' Условная инструкция If...Then...Else
If answer = Empty Then
' Вызов функции MsgBox
MsgBox Prompt:="Введите имя."
Else
' Функция MsgBox объединена с переменной answer
MsgBox Prompt:="Имя переменной " & answer
' Завершает инструкцию If...Then...Else
End If
' Завершает процедуру Sub
End Sub
Инструкции присвоения присваивают выражение переменной или константе. Инструкции присвоения всегда включают знак равенства (=). В следующем примере переменной yourName присваивается возвращаемое значение функции InputBox.
Sub Question()
Dim yourName As String
yourName = InputBox("Как Ваше имя?")
MsgBox "Ваше имя - " & yourName
End Sub
Инструкция Let необязательна и чаще всего опускается. К примеру, предыдущую инструкцию присвоения можно написать следующим образом:
Let yourName = InputBox("Как Ваше имя?").
Для присвоения объекта переменной, описанной как объект, применяется инструкция Set. Ключевое слово Set обязательно. В следующем примере инструкция Set присваивает диапазон на листе Sheet1 объектной переменной myCell:
Sub ApplyFormat()
Dim myCell As Range
Set myCell = Worksheets("Sheet1").Range("A1")
With myCell.Font
.Bold = True
.Italic = True
End With
End Sub
Инструкции, задающие значение свойства также являются инструкциями присвоения. В следующем примере задается свойство Bold объекта Font для активной ячейки:
ActiveCell.Font.Bold = True
Инструкции описания используются для описания процедур, переменных, массивов и констант и для присвоения им имен. При описании процедур, переменных или констант задается также их область определения, которая зависит от того, где расположено описание и какие ключевые слова при этом использованы.
Следующий пример содержит три описания.
Sub ApplyFormat()
Const limit As Integer = 33
Dim myCell As Range
' Другие инструкции
End Sub
Инструкция Sub (с парной ей инструкцией End Sub) описывает процедуру с именем ApplyFormat. Все инструкции, заключенные между Sub и End Sub выполняются всегда, когда вызывается или выполняется процедура ApplyFormat.
Процедура Sub
Инструкция Const описывает константу limit, задавая ей тип данных Integer и значение 33.
Описание констант
Инструкция Dim описывает переменную myCell. Тип данных объектный, в данном случае это объект Microsoft Excel Range. Переменную можно описать как объект, представленный в текущем приложении. Инструкции Dim относятся к типу инструкций, используемых для описания переменных. Другие ключевые слова, используемые для описания, - это ReDim, Static, Public, Private, и Const.
Описание переменных
Исполняемая инструкция инициирует действие. Она может выполнить метод или функцию, а также может организовать повторение или ветвление блоков программы. Исполняемые инструкции часто содержат математические или условные операторы.
В следующем примере используется инструкция For Each...Next для итераций по всем ячейкам диапазона с именем MyRange на листе Sheet1 текущей книги Microsoft Excel. Переменная c представляет собой ячейку в семействе ячеек, содержащемся в MyRange.
Sub ApplyFormat()
Const limit As Integer = 33
For Each c In Worksheets("Sheet1").Range("MyRange").Cells
If c.Value > limit Then
With c.Font
.Bold = True
.Italic = True
End With
End If
Next c
MsgBox "Все сделано!"
End Sub
Инструкция If...Then...Else в этом примере проверяет значение ячейки. Если значение больше 33, инструкция With задает свойства Bold и Italic объекту Font для этой ячейки. Инструкция If...Then...Else завершается инструкцией End If.
Инструкция With облегчает набор текста программы, поскольку все инструкции, которые она содержит, автоматически выполняются для объекта, следующего за ключевым словом With.
Инструкция Next вызывает следующую ячейку семейства, содержащегося в MyRange.
Функция MsgBox (которая отображает встроенное окно диалога Visual Basic) выводит на экран сообщение о том, что выполнение процедуры Sub закончилось.
При работе с большим количеством данных часто бывает удобно записывать данные в файл или считывать из файла. Инструкция Open позволяет напрямую создать файл и получить к нему доступ. Инструкция Open обеспечивает три типа доступа к файлам:
Последовательный доступ (режимы Input, Output и Append режимы), обычно используемый для записи текстовых файлов, например протоколов ошибок или отчетов.
Произвольный доступ (режим Random), используемый при необходимости считать и записать данные в файл без его закрытия. Файлы произвольного доступа содержат данные в виде записей, которые упрощают и ускоряют поиск нужных сведений.
Двоичный доступ (режим Binary), используется, когда требуется считать или записать байт в любую позицию в файле, например при сохранении или отображении точечных изображений.
Примечание. Инструкцию Open не следует использовать для доступа к собственным типам файлов приложений. Например, не следует использовать Open для доступа к документу Word, к электронной таблице Microsoft Excel или к базе данных Microsoft Access, поскольку это вызовет потерю целостности и порчу файла.
В следующей таблице показываются инструкции, обычно используемые для записи данных в файлы и для чтения данных из файлов.
Тип доступа |
Запись данных |
Чтение данных |
Последовательный |
Print #, Write # |
Input # |
Произвольный |
Put |
Get |
Двоичный |
Put |
Get |
Назад | Содержание | Вперед