Инструкции описания
Инструкции описания используются для описания процедур, переменных, массивов и констант и для присвоения им имен. При описании процедур, переменных или констант задается также их область определения, которая зависит от того, где расположено описание и какие ключевые слова при этом использованы.
Следующий пример содержит три описания.
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.
Описание переменных
Инструкции присвоения
Инструкции присвоения присваивают выражение переменной или константе. Инструкции присвоения всегда включают знак равенства (=). В следующем примере переменной 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
Инструкция Do...Loop
Инструкция Do...Loop используется для выполнения наборов инструкций неопределенное число раз. Набор инструкций повторяется, пока условие имеет значение True, либо пока оно не примет значение True.
Повторение инструкций, пока условие имеет значение True
Имеется два способа проверки условия в инструкции Do...Loop с помощью ключевого слова While: условие проверяется до входа в цикл; условие проверяется после хотя бы однократного выполнения цикла.
В следующей процедуре ChkFirstWhile условие проверяется до входа в цикл. Если myNum задать равным 9 вместо 20, инструкции внутри цикла выполняться не будут. В процедуре ChkLastWhile инструкции внутри цикла выполняются только один раз до того как условие примет значение False.
Sub ChkFirstWhile()
counter = 0
myNum = 20
Do While myNum > 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "Выполнено " & counter & " итераций цикла."
End Sub
Sub ChkLastWhile()
counter = 0
myNum = 9
Do
myNum = myNum - 1
counter = counter + 1
Loop While myNum > 10
MsgBox "В цикле выполнено " & counter & " итераций."
End Sub
Повторение инструкций, пока условие не примет значение True
Имеется два способа проверки условия в инструкции Do...Loop с помощью ключевого слова Until: условие проверяется до входа в цикл (как продемонстрировано в процедуре ChkFirstUntil), или условие проверяется после хотя бы однократного выполнения цикла (как показано в процедуре ChkLastUntil). Итерации продолжаются, пока условие имеет значение False.
Sub ChkFirstUntil()
counter = 0
myNum = 20
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
Loop
MsgBox "В цикле выполнено " & counter & " итераций."
End Sub
Sub ChkLastUntil()
counter = 0
myNum = 1
Do
myNum = myNum + 1
counter = counter + 1
Loop Until myNum = 10
MsgBox "В цикле выполнено " & counter & " итераций."
End Sub
Выход из цикла Do...Loop
Инструкцию Do...Loop можно завершить с помощью инструкции Exit Do. Например, для завершения бесконечного цикла используется инструкция Exit Do в блоке True инструкции If...Then...Else или инструкции Select Case. Если условие имеет значение False, цикл будет выполняться как обычно.
В следующем примере переменной myNum присваивается значение, приводящее к бесконечному циклу. Инструкция If...Then...Else проверяет условие на myNum, а затем завершает инструкцию Do...Loop, предотвращая таким образом бесконечный цикл.
Sub ExitExample()
counter = 0
myNum = 9
Do Until myNum = 10
myNum = myNum - 1
counter = counter + 1
If myNum < 10 Then Exit Do
Loop
MsgBox "В цикле выполнено " & counter & " итераций."
End Sub
Примечание. Для прекращения бесконечного цикла используются клавиши ESC или CTRL+BREAK.
Инструкция For Each...Next
Инструкция For Each...Next повторяет набор инструкций для всех объектов семейства или для всех элементов массива. Visual Basic автоматически задает переменную во время каждого выполнения цикла. Например, в следующей процедуре закрываются все формы, за исключением формы, содержащей текущую процедуру.
Sub CloseForms()
For Each frm In Application.Forms
If frm.Caption <> Screen. ActiveForm.Caption Then frm.Close
Next
End Sub
В следующих строках программы выполняется цикл для всех элементов массива, и их значения присваиваются индексной переменной I.
Dim TestArray(10) As Integer, I As Variant
For Each I In TestArray
TestArray(I) = I
Next I
Циклы по диапазонам ячеек
Инструкция For Each...Next используется также для организации циклов по диапазонам ячеек. Следующая процедура выполняет цикл по диапазону A1:D10 на листе Sheet1 и присваивает любому числу, имеющему абсолютное значение меньше 0.01, значение 0 (ноль).
Sub RoundToZero()
For Each myObject in myCollection
If Abs(myObject.Value) < 0.01 Then myObject.Value = 0
Next
End Sub
Выход из цикла For Each...Next до его завершения
Допускается выход из цикла For Each...Next с помощью инструкции Exit For. Например, если возникает ошибка, для ее проверки можно использовать инструкцию Exit For в блоке True инструкции If...Then...Else или инструкции Select Case. Если ошибки нет, инструкция If...Then...Else имеет значение False, и выполнение цикла продолжается как ожидалось.
В следующем примере проверяется первая ячейка диапазона A1:B5, которая не содержит числового значения. Когда такая ячейка найдена, на экран выводится сообщение, и Exit For завершает цикл.
Sub TestForNumbers()
For Each myObject In MyCollection
If IsNumeric(myObject.Value) = False Then
MsgBox "Объект не содержит числового значения."
Exit For
End If
Next c
End Sub
Инструкция For...Next
Инструкция For...Next используется для выполнения наборов инструкций указанное число раз. Циклы For используют в качестве счетчика переменную, значение которой увеличивается или уменьшается при каждом выполнении цикла.
Следующая процедура заставляет компьютер подавать звуковой сигнал 50 раз. Инструкция For определяет счетчик x и его начальное и конечное значения. Инструкция Next изменяет счетчик с шагом 1.
Sub Beeps()
For x = 1 To 50
Beep
Next x
End Sub
Имеется возможность увеличивать или уменьшать значение счетчика на указанную величину с помощью ключевого слова Step. В следующем примере счетчик j изменяется с шагом 2 при каждом выполнении цикла. По завершении цикла total равняется сумме 2, 4, 6, 8 и 10.
Sub TwosTotal()
For j = 2 To 10 Step 2
total = total + j
Next j
MsgBox "Сумма равна " & total
End Sub
Для уменьшения значения счетчика используется отрицательное значение Step. В этом случае указывается конечное значение, которое должно быть меньше начального значения. В следующем примере счетчик myNum уменьшается на 2 при каждом выполнении цикла. По окончании цикла total равняется сумме 16, 14, 12, 10, 8, 6, 4 и 2.
Sub NewTotal()
For myNum = 16 To 2 Step -2
total = total + myNum
Next myNum
MsgBox "Сумма равна " & total
End Sub
Примечание. Указание имени счетчика после инструкции Next не обязательно. В предыдущих примерах имя счетчика было указано для облегчения чтения программы.
Инструкция Exit For дает возможность завершения инструкции For...Next до того, как счетчик достигнет своего конечного значения. Например, если возникает ошибка, для ее проверки можно использовать инструкцию Exit For в блоке True инструкции If...Then...Else или инструкции Select Case. Если ошибки нет, инструкция If...Then...Else имеет значение False, и выполнение цикла продолжается как ожидалось.
Инструкция If...Then...Else
Инструкция 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
Инструкция Select Case
Инструкция 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 позволяет указывать объект или определяемый пользователем тип данных только один раз для последовательности инструкций. Инструкция 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
Исполняемые инструкции
Исполняемая инструкция инициирует действие. Она может выполнить метод или функцию, а также может организовать повторение или ветвление блоков программы. Исполняемые инструкции часто содержат математические или условные операторы.
В следующем примере используется инструкция 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 закончилось.
Использование констант
Программа может содержать часто встречающиеся постоянные значения, или же она может зависеть от некоторых чисел, которые запоминаются с трудом и не имеют очевидного смысла. В этом случае процесс чтения и эксплуатации программы можно упростить с помощью использования констант. Константа представляет собой значащее имя для числа или строки, которые не изменяются. В отличие от переменной константу нельзя модифицировать или присвоить ей новое значение.
Имеется три типа констант:
Внутренние константы, или константы, определяемые системой. Значения таких констант берутся из приложений и элементов управления. В других приложениях, имеющих библиотеки объектов, таких как Microsoft Access, Microsoft Excel и Microsoft Project, также предоставляется список констант, которые могут использоваться с методами, объектами и свойствами этих приложений. Список констант, предоставляемых для индивидуальных библиотек объектов, можно найти в окне Просмотр объектов.
Константы языка Visual Basic перечислены в библиотеках Visual Basic (VB), Visual Basic для приложений (VBA) и в библиотеке DAO (Data Access Object).
Примечание. Язык Visual Basic распознает константы в приложениях, созданных с помощью предыдущих версий Visual Basic или Visual Basic для приложений. Пользователь может обновить свои константы, чтобы они соответствовали списку в окне просмотра объектов. Константы, перечисленные в окне просмотра объектов, не требуют описания в приложении пользователя.
Символические константы, или константы, определяемые пользователем, описываются с помощью инструкции Const.
Условные константы компилятора описываются с помощью инструкции #Const.
В предыдущих версиях Visual Basic имена констант обычно изображались прописными буквами со знаком подчеркивания. Например:
TILE_HORIZONTAL
В данной версии внутренние константы именуются таким образом, чтобы избежать ситуаций, когда константам с одинаковыми именами в разных библиотеках объектов присваиваются различные значения. Имена констант задаются двумя способами:
С помощью префиксов
С помощью ссылок на библиотеку
Определение констант с помощью префиксов
Внутренние константы, определенные для любых объектами, записываются в формате со смешанным регистрами с двухбуквенным префиксом, означающим библиотеку объектов, которая описывает константу. Константы из библиотек объектов Visual Basic и Visual Basic для приложений имеют префикс "vb"; константы из библиотеки объектов Data Access Object имеют префикс "db"; а константы из библиотеки объектов Microsoft Excel имеют префикс "xl". В следующем примере проиллюстрировано, как меняются префиксы для специальных элементов управления, в зависимости от библиотеки типов.
vbTileHorizontal
dbAppendOnly
xlDialogborder
grdAlignCenter
Определение констант по ссылке через библиотеку
Допускается также ссылка на константу с помощью следующего синтаксиса:
[библиотека.] [модуль.]константа
Синтаксис для определения константы состоит из трех частей:
Например:
Threed.LeftJustify
Использование массивов
Имеется возможность описать массив для работы с набором значений одного типа данных. Массив представляет собой одну переменную с множеством ячеек памяти для хранения значений, тогда как обычная переменная имеет только одну ячейку, в которой может храниться только одно значение. При необходимости сослаться на все элементы массива можно ссылаться на массив как целое. Возможны также ссылки на его отдельные элементы.
Например, для записи денежных затрат на каждый день календарного года можно описать один массив с 365 элементами, вместо того, чтобы описывать 365 переменных. Каждый элемент массива содержит одно значение. Следующая инструкция описывает массив curExpense с 365 элементами. По умолчанию индексация массива начинается с нуля, так что верхняя граница массива - 364, а не 365.
Dim curExpense(364) As Currency
Чтобы задать значение отдельного элемента, надо указать его индекс. В следующем примере всем элементам массива присваивается исходное значение 20.
Sub FillArray()
Dim curExpense(364) As Currency
Dim intI As Integer
For intI = 0 to 364
curExpense(intI) = 20
Next
End Sub
Изменение нижней границы индексов
Для того, чтобы изменить индекс первого элемента массива, по умолчанию равный 0, на 1, можно использовать инструкцию Option Base в начале модуля. В следующем примере инструкция Option Base изменяет индекс первого элемента , а инструкция Dim описывает массив curExpense с 365 элементами.
Option Base 1
Dim curExpense(365) As Currency
Допускается также явное задание нижней границы индексов массива с помощью предложения To, как продемонстрировано в следующем примере.
Dim curExpense(1 To 365) As Currency
Dim strWeekday(7 To 13) As String
Запоминание значений Variant в массивах
Создать массив значений Variant можно двумя способами. Первый способ - это описание массива с типом данных Variant, как показано в следующем примере:
Dim varData(3) As Variant
varData(0) = "Мария Петрова"
varData(1) = "Зеленая, 19"
varData(2) = 38
varData(3) = Format("06-09-1952", "General Date")
Другой способ - это присвоение массива, возвращаемого функцией Array, переменной Variant, как продемонстрировано в следующем примере.
Dim varData As Variant
varData = Array("Иван Петров", "Зеленая, 19", 38, _
Format("06-09-1952", "General Date"))
Независимо от способа создания массива значений Variant его элементы нумеруются индексами. Например, следующая инструкция может быть добавлена к любому из предыдущих примеров.
MsgBox "Записаны данные для " & varData(0) & "."
Использование многомерных массивов
В языке Visual Basic допускается описание массивов, имеющих до 60 размерностей. Например, следующая инструкция описывает двумерный массив 5 на 10.
Dim sngMulti(1 To 5, 1 To 10) As Single
Если рассматривать этот массив как матрицу, то его первый аргумент представляет строки, а второй - столбцы.
Для обработки многомерных массивов используются вложенные инструкции For...Next. В следующей процедуре двумерный массив заполняется значениями типа данных Single.
Sub FillArrayMulti()
Dim intI As Integer, intJ As Integer
Dim sngMulti(1 To 5, 1 To 10) As Single
' Заполнение массива.
For intI = 1 To 5
For intJ = 1 To 10
sngMulti(intI, intJ) = intI * intJ
Debug.Print sngMulti(intI, intJ)
Next intJ
Next intI
End Sub
Использование скобок в программе
Процедуры 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)
Эффективное использование типов данных
Если обратное не указано, неописанные переменные приобретают тип данных Variant . Этот тип данных упрощает написание программ, но его использование не всегда является наиболее эффективным.
Следует предусмотреть применение других типов данных, если:
Программа имеет большой размер и очень много переменных.
Требуется как можно более быстрое выполнение программы.
Выполняется прямая запись данных в файлы с произвольным доступом.
Кроме типа Variant поддерживаются типы данных Byte, Boolean, Integer, Long, Single, Double, Currency, Decimal, Date, Object и String. Для описания переменной определенного типа используется инструкция Dim, например:
Dim X As Integer
Эта инструкция описывает переменную X как Integer - целые числа от -32768 и до 32767. При попытке присвоить X число, выходящее за пределы этого диапазона, возникает ошибка. При присваивании X дробного числа, выполняется округление. Например:
X = 32768' Вызывает ошибку.
X = 5.9' Задает для x значение 6.
Массивы параметров
Для передачи аргументов в процедуру может использоваться массив параметров. При описании процедуры не требуется указывать число элементов такого массива.
Для обозначения массива параметров используется ключевое слово ParamArray. Такой массив описывается как массив типа Variant и всегда представляет последние элементы из списка аргументов в описании процедуры .
Ниже приводится пример описания процедуры с массивом параметров.
Sub AnyNumberArgs(strName As String, ParamArray intScores() As Variant)
Dim intI As Integer
Debug.Print strName; " Scores"
' Использует функцию UBound для определения верхней границы массива.
For intI = 0 To UBound(intScores())
Debug.Print " "; intScores(intI)
Next intI
End Sub
В следующих строках приведены примеры вызова этой процедуры.
AnyNumberArgs "Иван", 10, 26, 32, 15, 22, 24, 16
AnyNumberArgs "Мария", "Высокий", "Низкий", "Средний", "Высокий"
Область определения и видимость
Область определения определяет доступность переменной, константы, или процедуры для других процедур. Имеется три уровня областей определения: уровень процедуры, личный уровень модуля и общий уровень модуля.
Область определения переменной определяется при описании этой переменной. Рекомендуется явно описывать все переменные для предотвращения ошибок, связанных с конфликтами имен между переменными с различными областями определения.
Область определения уровня процедуры
Переменная или константа, определенная внутри процедуры, недоступна вне этой процедуры .Она может использоваться только процедурой, которая содержит описание этой переменной. В первой процедуре следующего примера в окне сообщения содержится строка. Во второй процедуре окно сообщения останется пустым, так как переменная strMsg является локальной в первой процедуре.
Sub LocalVariable()
Dim strMsg As String
strMsg = "Эта переменная не может использоваться вне этой процедуры."
MsgBox strMsg
End Sub
Sub OutsideScope()
MsgBox strMsg
End Sub
Область определения уровня модуля
Переменная или константа уровня модуля может быть определена в разделе описаний модуля. Переменная уровня модуля может быть общей или частной. Общие переменные доступны для всех процедур во всех модулях проекта; личные переменные доступны только для процедур данного модуля. Переменные, описанные с инструкцией Dim в разделе описаний, по умолчанию определяются как частные. Однако если переменной предшествует ключевое слово Private, область определения задается программой пользователя.
В следующем примере строковая переменная strMsg доступна для всех процедур, описанных в модуле. При вызове второй процедуры в диалоговом окне выводится значение строковой переменной.
' Add following to Declarations section of module.
Private strMsg sAs String
Sub InitializePrivateVariable()
strMsg = "Эта переменная не может использоваться вне этого модуля."
End Sub
Sub UsePrivateVariable()
MsgBox strMsg
End Sub
Примечание. Общие процедуры в стандартном модуле или модуле класса доступны для любого адресующего проекта. Для ограничения области определения всех процедур в модуле текущего проекта в раздел описаний модуля помещается инструкция Option Private Module. Общие переменные и процедуры остаются доступными для других процедур текущего проекта, но не для адресующего проекта.
Область определения общего уровня модуля
Если переменная уровня модуля описана как общая, то она доступна для всех процедур проекта. В следующем примере строковая переменная strMsg может использоваться всеми процедурами во всех модулях проекта.
' Включает в раздел описаний модуля.
Public strMsg As String
Все процедуры являются общими, за исключением процедур обработки событий. Когда Visual Basic создает процедуру обработки события, перед ее описанием автоматически вставляется ключевое слово Private. Все другие процедуры, не являющиеся общими, должны быть описаны явным образом с ключевым словом Private.
Общие процедуры, переменные и константы, описанные в стандартном модуле или в модуле класса, могут использоваться в адресующем проекте. Однако сначала надо задать ссылку на проект, в котором они описаны.
Общие процедуры, переменные и константы, которые описаны не в стандартных модулях, и не в модулях класса, а например в модулях форм или отчетов, недоступны для адресующего проекта, так как эти модули являются личными для проекта, в котором они находятся.
Правила присвоения имен в языке Visual Basic
При присвоении имен процедурам, константам, переменным, и аргументам в модулеVisual Basic используются следующие правила:
Имена должны начинаться с буквы.
Имя не может содержать пробел, точку (.), восклицательный знак (!) или символы @, &, $, #.
Имена не должны содержать более 255 символов.
Как правило, не следует использовать имена, совпадающие с названиями функций, инструкций, и методов языка Visual Basic, так как при этом прекращается выделение в тексте одноименных ключевых слов языка. Чтобы использовать встроенные функции языка, инструкции или методы, имена которых конфликтуют с присвоенным пользователем именем, их необходимо явно указывать. Для этого перед именем встроенной функции, инструкции или метода, должно стоять имя связанной с ними библиотеки типов. Например, если имеется переменная с именем Left, то функция Left должна вызываться как VBA.Left.
Не допускается использование повторяющихся имен на одном уровне области определения. Нельзя, например, описать две переменных с именем age в одной процедуре. Однако описание личной переменной age и переменной уровня процедуры age внутри одного модуля допустимо.
Примечание. В языке Visual Basic не различаются строчные и прописные буквы, однако в инструкции описания сохраняются прописные буквы.
Процедура Function
Процедура 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
Процедура 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 Процедура 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
Работа с приложениями
Язык 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 создается с помощью этого синтаксиса. Информация о том, какие классы объектов могут быть созданы таким образом, содержится в документации по приложению.
Синтаксис Visual Basic
В разделах Справочника Visual Basic по методам, инструкциям или функциям объясняются все элементы синтаксиса, необходимые для правильного использования методов, инструкций или функций. В этих разделах приводятся примеры интерпретации наиболее распространенных элементов синтаксиса.
Синтаксис метода Activate
объект.Activate
В синтаксисе метода Activate слово объект представляет собой прототип для передаваемой информации - в данном случае это программа, возвращающая объект. Слова, выделенные полужирным шрифтом, должны набираться в точности так, как они написаны. Например, следующая процедура активизирует второе окно в активном документе.
Sub MakeActive()
Windows(2).Activate
End Sub
Синтаксис функции MsgBox
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
В синтаксисе функции MsgBox полужирные курсивные слова представляют собой именованные аргументы функции. Аргументы, заключенные в скобки, не обязательны (скобки не набираются в тексте программы на языке Visual Basic). Единственным аргументом, который пользователь должен задать для функции MsgBox, является текст подсказки.
Аргументы функций и методов могут указываться в программе в соответствии с позицией или по имени. Чтобы указать аргумент в соответствии с позицией, следует придерживаться синтаксиса, т.е. отделять аргументы запятой, например:
MsgBox "Ответ неверный!",0,"Заголовок окна"
Указание аргумента по имени состоит из имени аргумента, за которым следуют двоеточие со знаком равенства (:=) и значение аргумента. Именованные аргументы можно указывать в любом порядке, например:
MsgBox Title:="Заголовок окна", Prompt:="Ответ неверный!"
Синтаксис функций и некоторых методов содержит аргументы, заключенные в скобки. Эти функции и методы возвращают значения, поэтому необходимо заключать аргументы в скобки, чтобы присвоить значение переменной. Если возвращаемое значение не используется, или аргументы вообще не передаются, скобки не нужны. Методы, которые не возвращают значения, не требуют заключения аргументов в скобки. Эти правила применимы как для позиционных, так и для именованных аргументов.
В следующем примере значение, возвращаемое функцией MsgBox представляет собой число, обозначающее определенную кнопку, которое запоминается в переменной myVar. Поскольку используется возвращаемое значение, требуются скобки. Затем в другом окне сообщения появляется значение переменной.
Sub Question()
myVar = MsgBox(Prompt:="Я люблю свою работу.", _
Title:="Заголовок окна ", Buttons:="4")
MsgBox myVar
End Sub
Синтаксис инструкции Option
Option Compare
В синтаксисе инструкции Option Compare фигурные скобки и вертикальная черта указывают на принудительный выбор между тремя элементами (фигурные скобки не набираются в инструкциях языка Visual Basic). Например, следующая инструкция означает, что строки в модуле будут сравниваться в порядке сортировки, т.е. без учета регистра букв.
Option Compare Text
Синтаксис инструкции Dim
Dim имяПеременной[([индексы])] [As тип] [, имяПеременной[([индексы])] [As тип]] . . .
В синтаксисе инструкции Dim слово Dim является обязательным ключевым словом. Единственным обязательным элементом является имяПеременной. Например, следующая инструкция создает три переменных: myVar, nextVar и thirdVar. Они автоматически получают тип Variant.
Dim myVar, nextVar, thirdVar
В следующем примере переменная описывается как String. Использование типа данных экономит память и облегчает поиск ошибок в программе.
Dim myAnswer As String
Чтобы описать несколько переменных с помощью одной инструкции, надо указывать тип каждой переменной. Переменные, описанные без типа, автоматически приобретают тип Variant.
Dim x As Integer, y As Integer, z As Integer
В следующем примере x и y описаны с типом Variant, а z описан с типом Integer.
Dim x, y, z As Integer
Если описывается массив, необходимо указывать скобки. Индексы не обязательны. Следующая инструкция описывает динамический массив myArray.
Dim myArray()
Тип данных Variant
Если при описании константы, переменной, или аргумента не указан тип данных, им автоматически присваивается тип данных Variant. Переменные, описанные с типом данных Variant, могут содержать строку, дату, время, логические (Boolean) или числовые значения и могут автоматически преобразовываться к другому типу. Числовые значения Variant занимают 16 байт памяти (что существенно только в больших процедурах или в сложных модулях), и доступ к ним осуществляется медленнее, чем к переменным, которые описаны явным образом с любым другим типом. Тип данных Variant редко используется для констант. Строковое значение Variant занимает 22 байта памяти.
Следующие инструкции создают переменные Variant:
Dim myVar
Dim yourVar As Variant
theVar = "Это текст."
В последней инструкции переменная theVar не описывается явно, она описывается неявно или же автоматически. Переменные, описанные неявно, получают тип данных Variant.
Совет. Если для переменной или аргумента указан определенный тип данных, а затем используется неверный тип, то возникает ошибка. Чтобы избежать ошибок, связанных с типами данных, рекомендуется или использовать только неявно описанные переменные (тип данных Variant), или явно описывать все переменные с определенным типом данных. Последний способ предпочтительнее.
Запись данных в файлы
При работе с большим количеством данных часто бывает удобно записывать данные в файл или считывать из файла. Инструкция Open позволяет напрямую создать файл и получить к нему доступ. Инструкция Open обеспечивает три типа доступа к файлам:
Последовательный доступ (режимы Input, Output и Append режимы), обычно используемый для записи текстовых файлов, например протоколов ошибок или отчетов.
Произвольный доступ (режим Random), используемый при необходимости считать и записать данные в файл без его закрытия. Файлы произвольного доступа содержат данные в виде записей, которые упрощают и ускоряют поиск нужных сведений.
Двоичный доступ (режим Binary), используется, когда требуется считать или записать байт в любую позицию в файле, например при сохранении или отображении точечных изображений.
Примечание. Инструкцию Open не следует использовать для доступа к собственным типам файлов приложений. Например, не следует использовать Open для доступа к документу Word, к электронной таблице Microsoft Excel или к базе данных Microsoft Access, поскольку это вызовет потерю целостности и порчу файла.
В следующей таблице показываются инструкции, обычно используемые для записи данных в файлы и для чтения данных из файлов.
Тип доступа
Запись данных
Чтение данных
Последовательный
Print #, Write #
Input #
Произвольный
Put
Get
Двоичный
Put
Get