Устранение конфликтов имен

При попытке создать или использовать идентификатор , определенный ранее, возникает конфликт имен. В некоторых случаях при конфликтах имен вырабатываются ошибки типа "Обнаружено повторяющееся имя" или "Повторяющееся описание в текущей области определения". Если конфликты имен не обнаружены, они могут привести к ошибкам в программе, и, как следствие, к ошибочным результатам. Это особенно вероятно в том случае, если все переменные не были описаны явным образом до их применения.

Для предотвращения большинства конфликтов имен необходимо аккуратно разобраться с областями определения идентификаторов для данных, объектов и процедур. Язык Visual Basic имеет три уровня областей определения: уровень процедуры, личный уровень модуля и общий уровень модуля.

Конфликты имен могут возникать, если идентификатор:

•	Является видимым более чем на одном уровне областей определения.

•	Имеет на одном и том же уровне два различных значения.

Например процедуры в различных модулях могут иметь одинаковое имя. Таким образом процедура по имени MySub может быть определена в модулях Mod1 и Mod2. Конфликты не возникают, если каждая процедура вызывается только из других процедур в ее собственном модуле. Однако возможно возникновение ошибки, если MySub вызывается из третьего модуля и отсутствует полная ссылка на определенный модуль, позволяющая различить эти две процедуры MySub.

Большинство конфликтов имен может быть разрешено с помощью предшествующего каждому идентификатору указателя, состоящего из имени модуля и, если нужно, имени проекта. Например:

YourProject.YourModule.YourSub MyProject.MyModule.MyVar

Предшествующая программа вызывает процедуру Sub YourSub и передает переменную MyVar как аргумент. Допускается использование любой комбинации указателей, позволяющей различить одинаковые идентификаторы.

Visual Basic сопоставляет каждую ссылку на идентификатор с "ближайшим" описанием такого идентификатора. Например, если MyID описан как Public в двух модулях проекта (Mod1 и Mod2), то можно указать MyID, описанный в Mod2 без дополнительного указания внутри Mod2, но необходимо точно задать его имя (как Mod2.MyID) для ссылки на него в Mod1. Это справедливо также, если Mod2 находится в другом проекте, который является напрямую адресуемым проектом. Однако если Mod2 находится в косвенно адресуемом проекте, т.е. таком, на который ссылается напрямую адресуемый проект, ссылки на его переменную по имени MyID всегда должны быть полными и содержать имя проекта. Если ссылка на MyID выполняется из внешнего напрямую адресуемого модуля, то она сопоставляется с первым описанием, обнаруженным в следующем порядке:

•	Напрямую адресуемые проекты в том порядке, в котором они появляются в окне диалога Ссылки, вызываемого из меню Сервис.

•	Модули каждого проекта. Следует отметить, что не существует внутреннего порядка для модулей проекта.

Имена объектов главного приложения (например, R1C1 в Microsoft Excel) не могут повторно использоваться на других уровнях области определения.

Совет.   К типичным ошибкам, вызывающим конфликты имен, относятся неоднозначные задания имен, повторяющиеся описания, неописанные идентификаторы и ненайденные процедуры. Задание в начале каждого модуля инструкции Option Explicit, требующее явного описания переменных до их использования, помогает избежать как возможных конфликтов имен, так и ошибок, связанных с идентификаторами.


Вызов процедур с одинаковыми именами

Вызов процедуры, находящейся в любом модуле одного проекта, осуществляется так же, как вызов процедуры в активном модуле. Однако если два (или более) модуля содержат процедуры с одинаковыми именами, необходимо явно указать имя модуля в инструкции вызова процедуры, как показано в следующем примере:

Sub Main()

Module1.MyProcedure

End Sub

Если две разные процедуры в двух различных проектах названы одинаковыми именами, то при вызове этих процедур необходимо явно указать имя проекта. Например, следующая процедура вызывает процедуру Main в модуле MyModule в проекте MyProject.vbp.

Sub Main()

[MyProject.vbp].[MyModule].Main

End Sub

Примечание.   Разные приложения имеют различные имена для проекта. Например в Microsoft Access проект называется базой данных (.mdb); а в Microsoft Excel он называется книгой Excel (.xls).

Правила вызова процедур

•	При переименовании модуля или проекта необходимо изменить имя данного модуля или проекта во всех инструкциях вызова; в противном случае Visual Basic не сможет найти вызываемую процедуру. Чтобы найти и заменить текст в модуле, можно использовать команду Заменить в меню Правка.

•	Для предотвращения конфликта имен между адресуемыми проектами рекомендуется давать процедурам уникальные имена. Тогда можно вызывать процедуры без указания проекта или модуля.


Вызов процедур Property

В следующей таблице приводится синтаксис для вызова процедур-свойств:

Процедура	Синтаксис
Property Let	[объект.]свойство(аргументы)] = аргумент
Property Get	переменная = [объект.]свойство(аргументы)]
Property Set	Set [объект.]свойство[.(аргументы)] = переменная
При вызове процедур Property Let или Property Set всегда имеется один аргумент справа от знака равенства (=).

При описании процедур Property Let или Property Set с несколькими аргументами Visual Basic передает крайний справа аргумент последнему аргументу в описании Property Let или Property Set. Например, следующая диаграмма показывает как аргументы в вызове процедуры Property сопоставляются с аргументами в описании Property Let:

На практике процедуры с несколькими аргументами используются только для создания массивов свойств.


Вызов процедур Sub и Function

Чтобы вызвать процедуру Sub из другой процедуры, следует указать имя этой процедуры и значения для всех требуемых аргументовs. Использование инструкции Call не обязательно, однако если она все же используется, аргументы должны быть заключены в скобки.

Можно использовать процедуру Sub для организации других процедур, это облегчает процесс восприятия этих процедур и их отладку. В следующем примере процедура Sub Main вызывает процедуру Sub MultiBeep, передавая значение 56 для ее аргумента. По окончании работы MultiBeep управление возвращается к Main, и Main вызывает процедуру Sub Message. Message показывает окно сообщения, когда пользователь выбирает мышью OK, управление возвращается к Main, и Main завершается.

Sub Main()

MultiBeep 56

Message

End Sub

Sub MultiBeep(numbeeps)

For counter = 1 To numbeeps

Beep

Next counter

End Sub

Sub Message()

MsgBox "Пора сделать перерыв!"

End Sub

Вызов процедур Sub с несколькими аргументами

Следующий пример показывает два способа вызова процедуры Sub с несколькими аргументами. Когда процедура HouseCalc вызывается во второй раз, аргументы заключаются в скобки, поскольку используется инструкция Call.

Sub Main()

HouseCalc 99800, 43100

Call HouseCalc(380950, 49500)

End Sub

Sub HouseCalc(price As Single, wage As Single)

If 2.5 * wage <= 0.8 * price Then

MsgBox "Этот дом слишком дорогой."

Else

MsgBox "Цена этого дома приемлема."

End If

End Sub

Использование скобок при вызове процедур Function

Чтобы получить возвращаемое значение функции, надо присвоить эту функцию переменной и заключить аргументы в скобки, как показано в следующем примере.

Answer3 = MsgBox("Вам нравится Ваша зарплата?", 4, "Question 3")

Если возвращаемое значение функции не требуется, можно вызвать функцию точно так же, как процедуру Sub. Надо опустить скобки, указать список аргументов и не присваивать функцию переменной, как показано в следующем примере.

MsgBox "Конец задачи!", 0, "Список задач"

Внимание!   Наличие скобок в предыдущем примере приведет к синтаксической ошибке.

Передача именованных аргументов

Инструкция в процедуре Sub или Function может передавать значения вызываемым процедурам с помощью именованных аргументов. Именованные аргументы можно перечислять в любом порядке. Именованный аргумент состоит из имени аргумента, за которым следует двоеточие, знак равенства (:=) и значение, присваиваемое аргументу.

В следующем примере вызывается функция MsgBox с помощью именованных аргументов без возвращаемого значения.

MsgBox Title:="Список задач", Prompt:="Конец задачи!"

Следующий пример вызывает функцию MsgBox с помощью именованных аргументов. Возвращаемое значение присваивается переменной answer3.

answer3 = MsgBox(Title:="Question 3", _

Prompt:="Вам нравится Ваша зарплата?", Buttons:=4)


Создание объектных переменных

Объектная переменная может рассматриваться как объект, ссылку на который она содержит. С ее помощью возможно задание или возвращение свойств объекта или использование любых его методов.

Для создания объектной переменной:

1	Опишите объектную переменную.

2	Присвойте эту объектную переменную объекту.

Описание объектной переменной

Для описания объектной переменной применяется инструкция Dim или одна из других инструкций описания (Public, Private или Static). Переменная, которая ссылается на объект, должна иметь тип Variant, Object, или тип определенного объекта. Например, возможны следующие описания:

' Описывает MyObject с типом Variant.

Dim MyObject

' Описывает MyObject с типом Object.

Dim MyObject As Object

' Описывает MyObject с типом Font.

Dim MyObject As Font

Примечание.   Если объектная переменная используется без предварительного описания, она по умолчанию приобретает тип даных Variant.

Имеется возможность описать объектную переменную с типом данных Object в том случае, если определенный объектный тип не известен до выполнения процедуры. Тип данных Object позволяет создать универсальную ссылку на любой объект.

Если определенный объектный тип известен, следует описать объектную переменную с этим объектным типом. Например, если используемое приложение содержит объектный тип Sample, возможно описание переменной для этого объекта с помощью одной из следующих инструкций:

Dim MyObject As Object	' Описывает объект как универсальный.

Dim MyObject As Sample	' Описывает объект только с типом Sample.

Описание определенных объектных типов обеспечивает автоматическую проверку типа данных, более быстрое выполнение и улучшает читабельность текста программы.

Присвоение объекта объектной переменной

Для присвоения объекта объектной переменной применяется инструкция Set. Имеется возможность присвоить объектное выражение или Nothing. Например допустимы следующие присвоения объектной переменной:

Set MyObject = YourObject	' Присваивает ссылку на объект.

Set MyObject = Nothing	' Удаляет ссылку на объект.

Можно комбинировать описание объектной переменной с присваиванием ей объекта с помощью ключевого слова New в инструкции Set. Например:

Set MyObject = New Object	' Создать и присвоить

Задание для объектной переменной значения Nothing прекращает сопоставление этой переменной с каким-либо определенным объектом. Это предотвращает случайное изменение объекта при изменении переменной. Объектная переменная всегда имеет значение Nothing после закрытия объекта, с которым она сопоставляется, поэтому легко проверить, указывает ли объектная переменная на реальный объект. Например:

If Not MyObject Is Nothing Then

' Переменная ссылается на объект.

. . .

End If

Разумеется, с помощью этого теста невозможно с абсолютной уверенностью определить, закрыл ли пользователь приложение, содержащее объект, на который ссылается объектная переменная.

Ссылка на текущий экземпляр объекта

Для ссылки на текущий экземпляр объекта, в котором в данное время выполняется программа, используется ключевое слово Me. Все процедуры, связанные с текущим объектом, имеют доступ к объекту, указываемому с помощью слова Me. Ключевое слово Me полезно, в частности, для передачи сведений о текущем экземпляре объекта в процедуру из другого модуля. Например предположим, что модуль содержит следующую процедуру:

Sub ChangeObjectColor(MyObjectName As Object)

MyObjectName.BackColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)

End Sub

Вызов этой процедуры и передача в качестве аргумента текущего экземпляра объекта выполняется с помощью следующей инструкции:

ChangeObjectColor Me


Создание рекурсивных процедур

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

Function RunOut(Maximum)

RunOut = RunOut(Maximum)

End Function

Эта ошибка менее очевидна, если две процедуры бесконечное число раз вызывают друг друга, или некоторое условие, ограничивающее рекурсию, никогда не выполняется. Рекурсия имеет свои области применения. Например, следующая процедура использует рекурсию для вычисления факториалов:

Function Factorial (N)

If N <= 1 Then	' Достигнут конец рекурсивных вызовов.

Factorial = 1	' (N = 0) завершение вызовов.

Else	' Повторный вызов функции, если N > 0.

Factorial = Factorial(N - 1) * N

End If

End Function

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

•	устранения ненужных переменных;

•	использования типов данных , отличных от Variant;

•	переосмысления логики процедуры. Часто вместо рекурсии можно воспользоваться вложенными циклами.


Описание массивов

Как и другие переменные, массивы описываются с помощью инструкций Dim, Static, Private или Public. Разница между скалярными переменными (т.е. не массивами) и массивами состоит в том, что для последних надо указывать размер массива. Массив с заданным размером называется массивом фиксированного размера. Массив с переменным размером называется динамическим.

Начало индексации массива с 0 или 1 определяется параметрами инструкции Option Base. Если не указано Option Base 1, нижняя граница индексов массива равняется нулю.

Описание массива фиксированного размера

В следующей строке программы массив фиксированного размера описывается как массив типа Integer, имеющий 11 строк и 11 столбцов:

Dim MyArray(10, 10) As Integer

Первый аргумент представляет строки, а второй - столбцы.

Как и при описании других переменных, если тип данных при описании массива не задается, подразумевается, что элементы массива имеют тип Variant. На каждый элемент массива типа Variant отводится 16 байт. Строковый элемент типа Variant занимает 22 байта. Для написания максимально компактной программы следует явно описывать массивы как принадлежащие к типу данных, отличному от Variant. В следующих строках программы сравниваются размерности нескольких массивов:

' Массив Integer занимает 22 байта (11 элементов * 2 байта).

ReDim MyIntegerArray(10) As Integer

' Массив Double-precision занимает 88 байт (11 элементов * 8 байт).

ReDim MyDoubleArray(10) As Double

' Массив Variant занимает не менее 176 байт (11 элементов * 16 байт).

ReDim MyVariantArray(10)

' Массив Integer занимает 100 * 100 * 2 байт (20,000 байт).

ReDim MyIntegerArray (99, 99) As Integer

' Массив Double-precision занимает 100 * 100 * 8 байт (80,000 байт).

ReDim MyDoubleArray (99, 99) As Double

' Массив Variant занимает не менее 160,000 байт (100 * 100 * 16 байт).

ReDim MyVariantArray(99, 99)

Максимальные размеры массива варьируются в зависимости от имеющейся операционной системы и доступной памяти. Использование массивов, превышающих по размеру объем доступной системной оперативной памяти, замедляет работу программы, поскольку при этом данные должны читаться с диска и записываться на диск.

Описание динамического массива

Если массив описан как динамический, можно изменять его размер во время работы программы. Для описания динамического массива используются инструкции Static, Dim, Private, или Public с пустыми скобками, как показано в следующем примере.

Dim sngArray() As Single

Примечание.   Можно воспользоваться инструкцией ReDim для неявного описания массива внутри процедуры. При этом надо точно задавать имя массива. В случае опечатки, даже если в модуле есть инструкция Option Explicit, будет создан второй массив.

В процедуре внутри области определения массива используется инструкция ReDim для изменения числа размерностей, определения числа элементов и задания верхних и нижних границ индексов для каждой размерности. Инструкцию ReDim можно применять для изменения динамического массива столько раз, сколько потребуется. Однако при каждом применении данные, содержащиеся в массиве, теряются. Инструкция ReDim Preserve увеличивает размер массива, сохраняя при этом его содержимое. В следующем примере показывается, как можно увеличить массив varArray на 10 элементов без уничтожения текущих значений элементов массива.

ReDim Preserve varArray(UBound(varArray) + 10)

Примечание.   Использование ключевого слова Preserve вместе с динамическим массивом позволяет изменить только верхнюю границу последней размерности массива, однако изменение числа размерностей невозможно.


Описание констант

При описании константы ей можно присвоить значащее имя. Инструкция Const используется для описания константы и определения ее значения. После описания константу нельзя модифицировать и нельзя присваивать ей новое значение.

Константа описывается в процедуре или в начале модуля, в разделе описаний. Константы уровня модуля по умолчанию являются личными. При описании общих констант уровня модуля инструкции Const должно предшествовать ключевое слово Public. Для явного описания личных констант перед инструкцией Const надо поставить ключевое слово Private. Это облегчает чтение и отладку программы. Дополнительные сведения содержатся в разделе "Область определения и видимость" справочника Visual Basic.

В следующем примере константа Public conAge описывается как Integer, и ей присваивается значение 34.

Public Const conAge As Integer = 34

Константы могут быть описаны одним из следующих типов данных: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String, или Variant. Поскольку значение константы уже известно, можно задать тип данных в инструкции Const. Дополнительные сведения содержатся в разделе "Типы данных" справочника Visual Basic.

Допускается также описание нескольких констант в одной строке. В этом случае, чтобы задать тип данных, надо указать определенный тип для каждой константы. В следующем примере константы conAge и conWage описываются как Integer.

Const conAge As Integer = 34, conWage As Currency = 35000


Описание переменных

При описании переменных обычно используется инструкция Dim. Для создания переменной на уровне процедуры инструкция описания помещается внутри процедуры. Чтобы создать переменную на уровне модуля, инструкция описания располагается в начале модуля, в разделе описаний.

В следующем примере создается переменная strName и задается тип данных String.

Dim strName As String

Когда эта инструкция располагается в процедуре, переменная strName может использоваться только в данной процедуре. Если же такая инструкция находится в разделе описаний модуля, то переменная strName доступна для всех процедур данного модуля, но не может использоваться процедурами из других модулей проекта. Чтобы сделать переменную доступной для всех процедур проекта, перед ней надо поставить инструкцию Public, как показано в следующем примере:

Public strName As String

Дополнительные сведения о присвоения имен переменным содержатся в разделе справочника Visual Basic "Правила присвоения имен в языке Visual Basic".

Переменные могут описываться как один из следующих типов данных: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String (для строк переменной длины), String * длина (для строк фиксированной длины), Object, или Variant. Если тип данных не задан, по умолчанию переменная приобретает тип Variant. Имеется также возможность создать определяемый пользователем тип данных с помощью инструкции Type. Дополнительная информация о типах данных содержится в разделе справочника Visual Basic "Типы данных".

Допускается также описание нескольких переменных в одной строке. В этом случае, чтобы задать тип данных, надо указать определенный тип для каждой переменной. В следующем примере переменные intX, intY, и intZ описываются как Integer.

Dim intX As Integer, intY As Integer, intZ As Integer

В следующей строке intX и intY описываются как Variant; и только intZ описывается как Integer.

Dim intX, intY, intZ As Integer

Можно не указывать тип данных переменной в описании. Если тип данных не указан, переменная приобретает тип Variant.

Инструкция Public

Инструкция Public используется для описания общих переменных на уровне модуля.

Public strName As String

Общие переменные могут использоваться в любой процедуре проекта. Если общая переменная описана в стандартном модуле или в модуле класса, она также может использоваться в любом проекте, в котором имеется ссылка на проект, где описана эта переменная.

Инструкция Private

Инструкция Private используется для описания личных переменных уровня модуля.

Private MyName As String

Личные переменные доступны только для процедур одного и того же модуля.

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

Инструкция Static

Переменные, описанные с помощью инструкции Static вместо инструкции Dim, сохраняют свои значения при выполнении программы.

Инструкция Option Explicit

В языке Visual Basic можно неявно описать переменную, просто используя ее в инструкции присвоения. Все неявно описанные переменные имеют тип Variant. Переменные типа Variant более требовательны к ресурсам памяти, чем большинство других переменных. Программа будет более эффективной, если переменные явно описаны с определенным типом данных. Явное описание всех переменных уменьшает вероятность конфликтов имен и ошибок, связанных с опечатками.

Если неявные описания нежелательны, инструкция Option Explicit должна предшествовать в модуле всем процедурам. Эта инструкция налагает требование явного описания всех переменных этого модуля. Если модуль содержит инструкцию Option Explicit, при попытке использования неописанного или неверно введенного имени переменной возникает ошибка во время компиляции.

В программной среде Visual Basic имеется возможность установить параметр, автоматически включающий инструкцию Option Explicit во все новые модули. В документации приложения содержатся справочные сведения по изменению параметров среды Visual Basic. Следует отметить, что этот параметр не изменяет текст программы пользователя.

Примечание.   Явное описание динамических массивов и массивов с фиксированной размерностью обязательно.

Описание объектной переменной для программирования объектов

Когда приложение используется для управления объектами из другого приложения, необходимо создать ссылку на библиотеку типов второго приложения. Когда ссылка определена, имеется возможность описать объектные переменные с наиболее подходящим для них типом. Например, если при работе в Microsoft Access определяется ссылка на библиотеку типов Microsoft Excel, то внутри Microsoft Access можно описать переменную типа Worksheet, чтобы она представляла объект Worksheet Microsoft Excel.

Если для управления объектами Microsoft Access используется другое приложение, то, как правило, объектные переменные описываются с наиболее подходящим для них типом. Возможно также использование ключевого слова New для автоматического создания нового экземпляра объекта. Однако необходимо указать, что это объект Microsoft Access. Например, если описывается объектная переменная, представляющая форму Microsoft Access внутри Microsoft Visual Basic, необходимо различать объект Form Microsoft Access и объект Form Visual Basic . Имя библиотеки типов включается в описание переменной, как показано в следующем примере:

Dim frmOrders As New Access.Form

Некоторые приложения не распознают отдельные объектные типы Microsoft Access. Даже если в этих приложениях создана ссылка на библиотеку типов Microsoft Access, необходимо описать все объектные переменные Microsoft Access с типом Object. В этом случае ключевое слово New также не может использоваться для создания нового экземпляра объекта. В следующем примере показано, как в таком приложении надо описывать переменную, чтобы она представляла экземпляр объекта Application Microsoft Access. Затем приложение создает экземпляр объекта Application.

Dim appAccess As Object

Set appAccess = CreateObject("Access.Application")

Синтаксис, поддерживаемый приложением, описан в документации по приложению.


Выполнение программы с установкой свойств

Допускается создание процедур Property Let, Property Set и Property Get с одним и тем же именем. Таким образом создается группа связанных процедур, работающих совместно. Имя, данное процедуре Property, не может использоваться в качестве имени процедур Sub и Function, переменой или определяемого пользователем типа данных.

Инструкция Property Let позволяет создать процедуру, которая задает значение свойства. Примером может служить процедура Property, которая создает свойство инвертирования точечного рисунка в форме. Ниже представлен синтаксис вызова процедуры Property Let:

Form1.Inverted = True

Реальная работа по инвертированию точечного рисунка в форме выполняется в процедуре Property Let:

Private IsInverted As Boolean

Property Let Inverted(X As Boolean)

IsInverted = X

If IsInverted Then

…

(statements)

Else

(statements)

End If

End Property

Переменная уровня формы IsInverted содержит значение этого свойства. Если она описана как Private, пользователь может изменить ее только с помощью процедуры Property Let. Рекомендуется использовать имя, которое облегчает понимание того, что переменная использована для этого свойства.

Процедура Property Get свойства Inverted:

Property Get Inverted() As Boolean

Inverted = IsInverted

End Property

Процедуры-свойства упрощают выполнение программы одновременно с присвоением значения свойства. Они могут использоваться для выполнения следующих операций:

•	Определение значения свойства до того, как оно присвоено.

•	Присвоение свойства на основе нового значения.


Циклы в программе

Использование условных инструкций и инструкций цикла, называемых также управляющими структурами, позволяет написать программу на языке Visual Basic, которая будет принимать решения и повторять операции. Другая полезная управляющая структура - инструкция With, позволяет выполнить последовательность инструкций, не повторяя задание имени объекта.

Использование условных инструкций

Условные инструкции проверяют, имеет ли условие значение True, или же False, и, в зависимости от результата, указывают одну или несколько дальнейших инструкций. Обычно условие является выражением, которое использует оператор сравнения для сравнения одного значения переменной с другим.

Выбор условной инструкции

•	If...Then...Else: ветвление программы в зависимости от значения условия True или False

•	Select Case: выбор ветви из набора условий

Использование циклов для повторения блоков программы

Использование циклов дает возможность повторного выполнения набора инструкций. Некоторые циклы повторяют инструкции пока условие имеет значение False; другие - пока значение условия равно True. Имеются также циклы, которые повторяют набор инструкций определенное число раз или же выполняют его для каждого объекта семейства.

Типы циклов

•	Do...Loop: повторяет набор инструкций, пока условие имеет значение True или пока оно не примет значение True

•	For...Next: использует счетчик. Повторяет набор инструкций указанное число раз.

•	For Each...Next: повторяет набор инструкций для каждого объекта семейства

Выполнение нескольких инструкций над одиночным объектом

В Visual Basic, как правило, требуется указать объект перед выполнением одного из его методов или изменением одного из его свойств. С помощью инструкции With можно указать объект только один раз для последовательности инструкций.

•	With: выполняет последовательность инструкций над одиночным объектом


Оптимизация циклов For...Next

Переменные целого типа занимают меньше памяти, чем переменные с типом данных Variant и их обновление выполняется немного быстрее. Однако, это отличие становится заметным только при выполнении многих тысяч операций. Например:

Dim CountFaster As Integer	' В первом случае используем Integer.

For CountFaster = 0 to 32766

Next CountFaster

Dim CountSlower As Variant	' Во втором случае используем Variant.

For CountSlower = 0 to 32766

Next CountSlower

В первом случае требуется немного меньше времени для выполнения, чем во втором. Однако, если значение CountFaster превышает 32767, возникает ошибка. Для устранения этой ошибки можно изменить тип данных CountFaster на тип данных Long, который допускает больший диапазон целых чисел. Вообще говоря, чем меньше значения какого-либо типа данных, тем меньше времени требуется для их обновления. Обновление для значений типа Variant выполняется немного медленнее, чем для значений соответствующего им типа данных.


Эффективная передача аргументов

Если не задается обратное, аргументы передаются в процедуры по ссылке. Это эффективно, так как все аргументы, передаваемые по ссылке, требуют одинакового времени для передачи и одинакового количества памяти (4 байта) для каждой процедуры, независимо от типа данных аргумента.

Если включить ключевое слово ByVal в описание процедуры, то аргумент будет передан по значению. Аргументы, переданные по значению, занимают от 2 до 16 байт на процедуру, в зависимости от типа данных аргументов. Типы данных большего размера требуют на передачу немного больше времени. По этой причине обычно не следует передавать по значению типы данных String и Variant.

При передаче аргумента по значению создается копия исходной переменной. Изменения аргумента в процедуре не распространяются на значение исходной переменной. Например:

Function Factorial (ByVal MyVar As Integer)	' Описание функции.

MyVar = MyVar - 1

If MyVar = 0 Then

Factorial = 1

Exit Function

End If

Factorial = Factorial(MyVar) * (MyVar + 1)

End Function

' Вызов функции Factorial с переменной S.

S = 5

Print Factorial(S)	' Выводит на экран 120 (факториал 5).

Print S	' Выводит на экран 5.

Без ключевого слова ByVal в описании функции приведенные выше инструкции Print выводят на экран 1 и 0. Причина заключается в том, что MyVar ссылается затем на переменную S, которая уменьшается на 1 до тех пор, пока не станет равной 0.

Поскольку ByVal создает копию аргумента, она позволяет передавать в функцию Factorial значение типа Variant. Невозможна передача по ссылке значений типа Variant если процедура, описывающая аргумент, использует другой тип данных.


Возвращение строк из функций

Некоторые функции имеют по две версии, одна из которых возвращает тип данных Variant а другая -- тип данных String. Первая версия является более удобной, так как при этом для значений типа Variant преобразование типов данных выполняется автоматически. В ней также допускается передача значения Null через выражение. Вторая версия, возвращающая тип String, более эффективна, так как она использует меньше памяти.

Версия, возвращающая тип String, может быть полезна в следующих случаях:

•	Программа имеет большой размер и использует очень много переменных.

•	Выполняется прямая запись данных в файлы с произвольным доступом.

Следующие функции возвращают значения типа String, если к имени функции добавляется символ доллара ($). Эти функции имеют такое же применение и синтаксис, как и их эквиваленты без символа доллара, возвращающие тип Variant.

Chr$	ChrB$	*Command$
CurDir$	Date$	Dir$
Error$	Format$	Hex$
Input$	InputB$	LCase$
Left$	LeftB$	LTrim$
Mid$	MidB$	Oct$
Right$	RightB$	RTrim$
Space$	Str$	String$
Time$	Trim$	Ucase$
* Функция доступна не во всех приложениях.


Условная компиляция

Условная компиляция используется для выборочного выполнения блоков программы, например, при отладке инструкций, сравнивающих различные подходы к программированию одной и той же задачи, или при локализации приложения для другой языковой среды.

При помощи директивы #Const в программе определяется условная константа компилятора, а директива #If...Then...#Else служит для указания на блок программы, предназначенный для условной компиляции. В следующем примере в зависимости от значения переменной соnDebug программа выполняется с инструкциями отладки или без них.

' Описывает общую константу компиляции в разделе описаний.

#Const conDebug = 1

Sub SelectiveExecution()

#If conDebug = 1 Then

.	' Выполняет программу с инструкциями отладки.

.

.

#Else

.	' Выполняет обычную программу.

.

.

#End If

End Sub


Время жизни переменных

Временем жизни переменной называется время, в течение которого переменная может иметь значение. Значение переменной может меняться на протяжении ее времени жизни, но в течение этого времени она обязательно имеет какое-либо. Когда переменная теряет область определения, она более не имеет значения.

В начале выполнения процедуры все переменные инициализируются. Числовая переменная получает значение 0, строка переменной длины получает значение пустой строки (""), а строка фиксированной длины заполняется ASCII символом 0 или Chr(0). Переменные типа Variant получают при инициализации значение Empty. Каждый элемент массива переменных с определяемым пользователем типом при инициализации получает значение, которое он получил бы, если бы являлся одиночной переменной.

При описании объектной переменной для нее выделяется память, но ее значение определяется как Nothing до тех пор, пока ей не присвоена ссылка на объект с помощью инструкции Set.

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

Переменная, описанная с помощью инструкции Dim на уровне процедуры, сохраняет значение до окончания выполнения процедуры. Если процедура вызывает другие процедуры, переменная сохраняет свое значение, пока не закончится выполнение и этих процедур.

Если переменная уровня процедуры описана с помощью ключевого слова Static, она сохраняет свое значение до тех пор, пока программа выполняется в каком-либо модуле. По завершении работы всей программы переменная теряет свою область определения и свое значение. Ее время жизни совпадает с временем жизни переменной уровня модуля.

Переменная уровня модуля отличается от статической переменной. В стандартном модуле или в модуле класса она сохраняет свое значение до завершения выполнения программы. В модуле класса она сохраняет значение пока существует экземпляр этого класса. Переменные уровня модуля занимают память, пока их значения не удалены, поэтому их следует использовать только при необходимости.

Если перед инструкциями Sub или Function имеется ключевое слово Static, значения всех переменных уровня процедуры сохраняются между вызовами процедуры.


Именованные и аргументы Optional

При вызове процедур Sub или Function возможна позиционная передача аргументов, т.е. в порядке следования в описании процедуры. Кроме того, аргументы могут передаваться по именам, вне зависимости от позиции.

Например следующая процедура Sub имеет три аргумента:

Sub PassArgs(strName As String, intAge As Integer, dteBirth As Date)

Debug.Print strName, intAge, dteBirth

End Sub

Эту процедуру можно вызвать, передавая ее аргументы в соответствии с позициями и разделяя их запятой, как показано в следующем примере:

PassArgs "Маша", 26, #2-21-69#

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

PassArgs intAge:=26, dteBirth:=#2/21/69#, strName:="Маша"

 Именованный аргумент состоит из имени аргумента, за которым следует двоеточие со знаком равенства (:=) и значение аргумента.

Именованные аргументы особенно полезны при вызове процедуры с необязательными аргументами (Optional). Если используются именованные аргументы, то запятые для обозначения отсутствующих позиционных аргументов не нужны. С помощью именованных аргументов проще проследить, какие аргументы переданы, а какие опущены.

В описании процедуры перед необязательными аргументами должно стоять ключевое слово Optional. Кроме того, в описании процедуры можно присвоить значение необязательному аргументу, которое он принимает по умолчанию. Например:

Sub OptionalArgs(strState As String, Optional strCountry As String = "USA")

. . .

End Sub

При вызове процедуры с аргументом Optional можно как указывать, так и не указывать необязательный аргумент. Если аргумент не описан, то для него используется имеющееся значение по умолчанию. Если по умолчанию значение не присвоено, аргумент обрабатывается так же, как любая другая переменная указанного типа.

В следующей процедуре имеется необязательный аргумент, переменная varCountry. Функция IsMissing определяет, был ли передан в процедуру необязательный аргумент.

Sub OptionalArgs(strState As String, Optional intRegion As Integer, _

Optional strCountry As String = "USA")

If IsMissing(intRegion) And IsMissing(strCountry) Then

Debug.Print strState

ElseIf IsMissing(strCountry) Then

Debug.Print strState, intRegion

ElseIf IsMissing(intRegion) Then

Debug.Print strState, strCountry

Else

Debug.Print strState, intRegion, strCountry

End If

End Sub

Эту процедуру можно вызвать с помощью именованного аргумента, как показано в следующих примерах.

OptionalArgs strCountry:="USA", strState:="MD"

OptionalArgs strState:= "MD", intRegion:=5


Объекты, свойства, методы и события

Объект представляет элемент приложения, как например лист, ячейка, диаграмма, форма или отчет. В программе на языке Visual Basic необходимо идентифицировать объект, прежде чем применять к нему методы или изменять значения его свойства.

Семейство (объект Collection) представляет собой объект, содержащий несколько других объектов, как правило, одного и того же типа. Например, в Microsoft Excel объект Workbooks содержит все открытые объекты Workbook. В Visual Basic семейство Forms содержит все объекты Form приложения.

Элемент семейства может быть идентифицирован по номеру или по имени. Например, в следующей процедуре Workbooks(1) обозначает первый открытый объект Workbook.

Sub CloseFirst()

Workbooks(1).Close

End Sub

Следующая процедура использует имя, определенное как строка для указания на объект Form.

Sub CloseForm()

Forms("MyForm.frm").Close

End Sub

Если объекты имеют общие методы, можно рассматривать семейство объектов как одно целое. Например, в следующей процедуре закрываются все открытые формы.

Sub CloseAll()

Forms.Close

End Sub

Метод представляет собой действие, выполняемое над объектом. Например, Add - метод объекта ComboBox, поскольку он добавляет новую запись в поле со списком.

В следующей процедуре для внесения нового элемента в объект ComboBox (поле со списком) используется метод Add.

Sub AddEntry(newEntry as String)

Combo1.Add newEntry

End Sub

Свойство представляет собой атрибут объекта, определяющий характеристики объекта, такие как размер, цвет, положение на экране или состояние объекта, например, доступность или видимость. Чтобы изменить характеристики объекта, надо просто изменить значения его свойств.

Чтобы задать значение свойства, надо указать объект, через точку указать имя свойства, затем знак равенства (=) и новое значение свойства. Например, в следующей процедуре изменяется заголовок формы Visual Basic посредством задания свойства Caption.

Sub ChangeName(newTitle)

myForm.Caption = newTitle

End Sub

Некоторые свойства не задаются. В разделах Справочника для всех свойств указано, можно ли задать свойство (чтение-запись), только прочитать его (только чтение) или только записать (только запись).

Имеется возможность отыскивать информацию об объекте, возвращая значение какого-либо из его свойств. В следующей процедуре используется окно сообщения для вывода на экран заголовка активной в данный момент формы.

Sub GetFormName()

formName = Screen.ActiveForm.Caption

MsgBox formName

End Sub

Событие представляет собой действие, распознаваемое объектом (например, щелчок мышью или нажатие клавиши), для которого можно запрограммировать отклик. События возникают в результате действий пользователя или программы, или же они могут быть вызваны системой.

Возвращение объектов

В любом приложении имеется способ возвращать объекты, которые оно содержит. Однако, поскольку эти способы отличаются, следует обращаться к разделу Справочника по данному объекту или семейству, чтобы узнать, как возвращать объект.


Программирование объектов

Программирование объектов (ранее программирование OLE ) является свойством модели COM (Component Object Model), стандартной технологии, которая используется приложениями, чтобы предоставить свои объекты в распоряжение средств разработки, макроязыков и других приложений, поддерживающих программирование объектов. Например, приложение для работы с электронными таблицами может предоставлять для использования лист, диаграмму, ячейку или диапазон ячеек в качестве различных типов объектов. Текстовой процессор может предоставлять для использования объекты типа приложений, документов, абзацев, предложений, закладок или выделенных фрагментов.

Если приложение поддерживает программирование объектов, предоставляемые им объекты доступны из языка Visual Basic. Visual Basic позволяет проводить обработку этих объектов с помощью методов этих объектов или с помощью чтения или установки свойств этих объектов. Например, если был создан программируемый объект по имени MyObj, для управления этим объектом можно использовать следующую программу:

MyObj.Insert "Всем привет."	' Размещает текст.

MyObj.Bold = True	' Форматирует текст.

MyObj.SaveAs  "C:\WORDPROC\DOCS\TESTOBJ.DOC"	' Сохраняет объект.

Следующие функции позволяют получить доступ к программируемому объекту:

Функция	Описание
CreateObject	Создает новый объект указанного типа.
GetObject	Загружает объект из файла.
Сведения о поддерживаемых объектом свойствах и методах содержатся в документации к определенному приложению. Объекты, функции, свойства и методы, поддерживаемые приложением, определяются обычно в библиотеке объектов приложения.


Массивы параметров

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

Для обозначения массива параметров используется ключевое слово 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.

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

Общие процедуры, переменные и константы, которые описаны не в стандартных модулях, и не в модулях класса, а например в модулях форм или отчетов, недоступны для адресующего проекта, так как эти модули являются личными для проекта, в котором они находятся.


Тип данных Variant

Если при описании константы, переменной, или аргумента не указан тип данных, им автоматически присваивается тип данных Variant. Переменные, описанные с типом данных Variant, могут содержать строку, дату, время, логические (Boolean) или числовые значения и могут автоматически преобразовываться к другому типу. Числовые значения Variant занимают 16 байт памяти (что существенно только в больших процедурах или в сложных модулях), и доступ к ним осуществляется медленнее, чем к переменным, которые описаны явным образом с любым другим типом. Тип данных Variant редко используется для констант. Строковое значение Variant занимает 22 байта памяти.

Следующие инструкции создают переменные Variant:

Dim myVar

Dim yourVar As Variant

theVar = "Это текст."

В последней инструкции переменная theVar не описывается явно, она описывается неявно или же автоматически. Переменные, описанные неявно, получают тип данных Variant.

Совет.   Если для переменной или аргумента указан определенный тип данных, а затем используется неверный тип, то возникает ошибка. Чтобы избежать ошибок, связанных с типами данных, рекомендуется или использовать только неявно описанные переменные (тип данных Variant), или явно описывать все переменные с определенным типом данных. Последний способ предпочтительнее.


Синтаксис 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 {Binary | Text | Database}

В синтаксисе инструкции 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()


Использование массивов

Имеется возможность описать массив для работы с набором значений одного типа данных. Массив представляет собой одну переменную с множеством ячеек памяти для хранения значений, тогда как обычная переменная имеет только одну ячейку, в которой может храниться только одно значение. При необходимости сослаться на все элементы массива можно ссылаться на массив как целое. Возможны также ссылки на его отдельные элементы.

Например, для записи денежных затрат на каждый день календарного года можно описать один массив с 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


Использование констант

Программа может содержать часто встречающиеся постоянные значения, или же она может зависеть от некоторых чисел, которые запоминаются с трудом и не имеют очевидного смысла. В этом случае процесс чтения и эксплуатации программы можно упростить с помощью использования констант. Константа представляет собой значащее имя для числа или строки, которые не изменяются. В отличие от переменной константу нельзя модифицировать или присвоить ей новое значение.

Имеется три типа констант:

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


Эффективное использование типов данных

Если обратное не указано, неописанные переменные приобретают тип данных 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.


Инструкция 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...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, и выполнение цикла продолжается как ожидалось.


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


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


Использование скобок в программе

Процедуры 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

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


Правила присвоения имен в языке 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

Процедура 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 {Get | Let | Set} имя_свойства_ [(список_аргументов)] [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


Инструкции присвоения

Инструкции присвоения присваивают выражение переменной или константе. Инструкции присвоения всегда включают знак равенства (=). В следующем примере переменной 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


Инструкции Visual Basic

Инструкция Visual Basic является полной командой. Она может содержать ключевые слова, операторы, переменные, константы и выражения. Любая инструкция относится к одной из следующих категорий:

•	Инструкции описания, именующие переменные, константы или процедуры, а также могут задавать типы данных.

Инструкции описания

•	Инструкции присвоения, которые присваивают значение или выражение переменной или константе.

Инструкции присвоения

•	Исполняемые инструкции, которые инициируют действие. Они могут выполнить метод или функцию, а также могут организовать повторение или ветвление блоков программы. Эти инструкции часто содержат математические или условные операторы.

Исполняемые инструкции

Продолжение инструкций на несколько строк

Обычно инструкция располагается на одной строке, но ее можно продолжить на следующую строку с помощью символа продолжения строки. В следующем примере исполняемая инструкция MsgBox продолжается на трех строках:

Sub DemoBox()  'Эта процедура описывает строковую переменную,

' присваивает ей значение Мария и выводит

' сцепленное сообщение.

Dim myVar As String

myVar = "Иван"

MsgBox Prompt:="Привет " & myVar, _

Title:="Приветствие", _

Buttons:=vbExclamation

End Sub

Комментарии

Комментарии позволяют объяснить процедуру или определенную инструкцию всем читателям программы. Когда процедура выполняется, Visual Basic игнорирует комментарии. Строки комментария начинаются с апострофа (') или со слова Rem, за которым следует пробел. Их можно вносить в любое место процедуры. Чтобы внести комментарий в строку, на которой расположена инструкция, после инструкции следует поставить апостроф, а за ним комментарий. По умолчанию комментарии выделяются в тексте зеленым цветом.

Проверка синтаксических ошибок

Если после набора строки и нажатия клавиши ENTER строка выделяется красным цветом (может появиться также сообщение об ошибке), необходимо выяснить, что неправильно в данной инструкции и исправить ее.