Меню Visual Basic

         

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


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



Именованные и аргументы 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



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


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



Команда Объект (меню "Вид")


Выводит активный элемент.

Кнопка панели инструментов:

. Клавиша быстрого вызова: SHIFT+F7.



Команда Окно контрольного значения (меню "Вид")


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

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

Кнопка панели инструментов:

.





Команда Окно локальных переменных (меню "Вид")


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

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

Кнопка панели инструментов:

.



Команда Окно отладки (меню "Вид")


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

Окно проверки полезно использовать для:

Тестирования сложного или нового текста программы.

Запроса или изменения значения переменной во время выполнения программы. При остановке следует присвоить переменной новое значение точно так, как это делается в программе.

Запроса или изменения значения свойства во время выполнения программы.

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

Просмотра отладочной информации, выводимой программой во время выполнения.

Кнопка панели инструментов:

. Клавиша быстрого вызова: CTRL+G.



Команда Окно проекта (меню "Вид")


Эта команда выводит Окно проекта с иерархическим списком открытых баз данных и их содержимым.

Окно проекта является инструментом лишь для перемещения и управления. Невозможно с его помощью построить приложение.

Кнопка панели инструментов:

. Клавиша быстрого вызова: CTRL+R.

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

Окно или область окна контрольного значения



Команда Описание (меню "Вид")


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

Клавиша быстрого вызова: SHIFT+F2.



Команда Панель элементов (меню "Вид")


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

Кнопка панели инструментов:

.



Команда Панели инструментов (меню "Вид")


Выбор этой команды приводит к появлению списка встроенных в Visual Basic панелей инструментов, также команды Настройка. Возможно:

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

Перемещение панелей инструментов по рабочему столу.

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

Правка Выводит панель инструментов Правка, содержащую кнопки для общих команд редактирования.

Стандарт Выводит панель инструментов Стандарт, являющуюся панелью инструментов по умолчанию.

UserForm Выводит панель инструментов UserForm, содержащую кнопки для работы с формой.

Настройка Выводит окно диалога Настройка, где возможна настройка или создание панелей инструментов и строк меню.



Команда Программа (меню Вид)


Выводит окно модуля класса для выделенного объекта.

Кнопка панели инструментов:

. Клавиша быстрого вызова: F7.



Команда Просмотр объектов (меню "Вид")


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

Кнопка панели инструментов:

. Клавиша быстрого вызова: F2.



Команда Стек вызова (меню "Вид")


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

При выполнении Visual Basic процедуры, она заносится в список активных вызовов. Если эта процедура вызывает другую, в списке активных вызовов оказывается уже две процедуры. Каждый раз, при вызове процедурой другой процедуры Sub, процедуры Function или процедуры Property, последняя добавляется в список. Процедура удаляется из списка, как только управление возвращается в вызывающую процедуру. Вызванные из окна проверки процедуры также вносятся в список вызовов.

Вызов окна диалога также возможен с путем нажатия кнопки вызова (...) рядом с полем процедуры в области Локальные окна отладки.

Кнопка панели инструментов:

Клавиша быстрого вызова: CTRL+L.



Команда Свойства (меню "Вид")


Выводит окно свойств, в котором перечисляются свойства времени разработки для выделенной формы, элемента управления, класса, проекта или модуля.

Кнопка панели инструментов:

. Клавиша быстрого вызова: F4.



Команда Вернуться к последней позиции (меню "Вид")


Эта команда позволяет быстро перемещаться из одного места программы в другое. Команда доступна в окне модуля, только если редактировался текст программы или вызывалась команда Описание. В Visual Basic сохраняются последние 8 строк, над которыми выполнялись какие-либо операции.

Клавиша быстрого вызова: CTRL+SHIFT+F2.



Команды меню "Окно"


"Разделить"

Переключает разделение окна модуля горизонтально на две части. Эта команда доступна, только когда активно окно модуля.

Кнопка панели инструментов:

"Сверху вниз"

Размещает все окна открытого документа проекта горизонтально.

Кнопка панели инструментов:

"Слева направо"

Размещает все окна открытого документа проекта вертикально.

Кнопка панели инструментов:

"Каскадом"

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

Кнопка панели инструментов:

"Упорядочить значки"

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

"Список окон"

Выводит список всех окон открытого документа.



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


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

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

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

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



Окно диалога Дополнительные элементы...


Позволяет добавлять в панель элементов проекта дополнительные элементы управления.

Параметры окна диалога

Доступные элементы Отображает доступные специальные элементы управления.

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

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

Только выбранные элементы - Отображает только те элементы из списка доступных элементов, которые выбраны для включения в проект.

Путь Отображает путь к элементу, выбранному в списке доступных элементов.



Окно диалога Последовательность перехода


Отображает порядок перехода между объектами и позволяет его изменять.

Параметры окна диалога

Последовательность Список объектов в порядке расположения их в форме.

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

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



Окно диалога Вставка файла


Служит для поиска и вставки файла в модуль проекта.

Параметры окна диалога

Папка

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

Переход на один уровень вверх

Отображает список папок или дисков, находящихся на один уровень выше текущей папки.

Создать новую папку

Создает новую папку.

Мелкие значки

Отображает папки и документы в виде списка маленьких значков и имен.

Сведения

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

Имя файла

Служит для ввода или выбора имени вставляемого файла.

Тип файлов

Служит для выбора типа файла; по умолчанию задаются текстовые файлы (*.txt). Файлы выбранного типа появляются в списке имен файлов.

Открыть

Вставка выбранного файла.

Отмена

Закрытие окна диалога без вставки файла.



Окно диалога Вставка процедуры


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

Параметры окна диалога

Имя Имя новой процедуры.

Тип Задает тип создаваемой процедуры.

Подпрограмма (Sub) - Создает новую процедуру Sub.

Функция (Function) - Создает новую процедуру Function.

Свойство (Property) - Создает пару процедур свойства Let и Get.

Область определения Устанавливает общую или личную область определения процедуры.

Все локальные переменные считать статическими Добавляет в описание процедуры ключевое слово Static.

OK Вставляет шаблон процедуры в окно модуля.

Отмена Закрывает окно диалога без вставки новой процедуры.



Окно UserForm


Позволяет создавать в проекте окна и окна диалога. Допускается рисование и просмотр элементов правления в форме.

При разработке формы:

Каждое окно имеет кнопки Развернуть, Свернуть и Закрыть.

Возможен просмотр и изменение размеров сетки формы на вкладке Общие окна диалога "Параметры".

Кнопки панели элементов служат для вставки в форму элементов управления. На вкладке Общие окна диалога "Параметры" возможно задать выравнивание элементов по линиям сетки.



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


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

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


При описании переменных обычно используется инструкция 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")
Синтаксис, поддерживаемый приложением, описан в документации по приложению.

Оптимизация циклов 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 выполняется немного медленнее, чем для значений соответствующего им типа данных.



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


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

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

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

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

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

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

Функция

Описание

 

CreateObject

Создает новый объект указанного типа.

GetObject

Загружает объект из файла.

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



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


Объектная переменная

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

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

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;

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



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


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

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

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

#Const conDebug = 1

Sub SelectiveExecution()

#If conDebug = 1 Then

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

.

.

#Else

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

.

.

#End If

End Sub



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


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

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



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


Некоторые функции имеют по две версии, одна из которых возвращает тип данных 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$

* Функция доступна не во всех приложениях.



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


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

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

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

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

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

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

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

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



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


Допускается создание процедур 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

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

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

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



Вызов процедур 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 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 не сможет найти вызываемую процедуру. Чтобы найти и заменить текст в модуле, можно использовать команду Заменить в меню Правка.

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



Вызов процедур 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)