Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по VBA.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
592.38 Кб
Скачать

Шаг 1 - Инструкции Visual Basic

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

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

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

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

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

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

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

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

Dim myVar As String

myVar = "Иван"

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

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

Buttons:=vbExclamation

End Sub

Шаг 2 - Список инструкций

Инструкция AppActivate Инструкция Beep Инструкция Call Инструкция ChDir Инструкция ChDrive Инструкция Close Инструкция Const Инструкция Date Инструкция Declare Инструкции DefТип Инструкция DeleteSetting Инструкция Dim Инструкция Do...Loop Инструкция End Инструкция Erase Инструкция Error Инструкция Exit Инструкция FileCopy Инструкция For Each...Next Инструкция For...Next Инструкция Function Инструкция Get Инструкция GoSub...Return Инструкция GoTo Инструкция If...Then...Else Инструкция Input # Инструкция Kill Инструкция Let Инструкция Line Input # Инструкция Load Инструкции Lock и Unlock Инструкция LSet Инструкция Mid Инструкция MkDir Инструкция Name Инструкция On Error Инструкции On...GoSub, On...GoTo Инструкция Open Инструкция Option Base Инструкция Option Compare Инструкция Option Explicit Инструкция Option Private Инструкция Print # Инструкция Private Инструкция Property Get Инструкция Property Let Инструкция Property Set Инструкция Public Инструкция Put Инструкция Randomize Инструкция ReDim Инструкция Rem Инструкция Reset Инструкция Resume Инструкция RmDir Инструкция Rset Инструкция SaveSetting Инструкция Seek Инструкция Select Case Инструкция SendKeys Инструкция Set Инструкция SetAttr Инструкция Static Инструкция Stop Инструкция Sub Инструкция Time Инструкция Type Инструкция Unload Инструкция While...Wend Инструкция Width # Инструкция With Инструкция Write #

Шаг 3 - Инструкция AppActivate

Активизирует окно приложения.

AppActivate title[, wait]

Параметры: title : Обязательный. Строковое выражение, указывающее содержимое строки заголовка окна приложения, которое следует активизировать. Для активизации приложения вместо аргумента title допускается использование кода задачи, возвращаемого функцией Shell. Wait : Необязательный. Выражение типа Boolean, указывающее, должно ли вызывающее приложение иметь фокус при активизации другого приложения. Если этот аргумент имеет значение False (по умолчанию), указанное приложение активизируется немедленно, независимо от наличия фокуса у вызывающего приложения. Если этот аргумент имеет значение True, указанное приложение активизируется только после получения фокуса вызывающим приложением.

Замечания Инструкция AppActivate передает фокус указанному приложению или окну, не изменяя его размеры. Активизированное окно приложения может потерять фокус в результате соответствующих действий пользователя или закрытия этого окна. Для запуска приложения и указания типа окна следует использовать функцию Shell. При определении приложения, подлежащего активизации, аргумент title последовательно сравнивается со строкой заголовка каждого приложения, находящегося в памяти компьютера. При отсутствии точного совпадения активизируется приложение, строка заголовка которого начинается с указанной строки title. Если в памяти компьютера находятся несколько экземпляров приложения, строка заголовка которого совпадает с указанной строкой title, активизируется произвольно выбранный один из этих экземпляров.

Пример В данном примере приведены различные способы активизации окна приложения с помощью инструкции AppActivate. При вызове функции Shell считается, что запускаемые приложения находятся там, где указано. На Macintosh для указания сигнатуры приложения вместо его имени используется функция MacID. Инструкцию AppActivate можно использовать с Macintosh System 7.0 или более поздней версии.

Dim MyAppID, ReturnValue

' В Microsoft Windows:

AppActivate "Microsoft Word" ' Активизирует Microsoft Word.

' Кроме того, можно использовать значение, возвращаемое функцией Shell.

MyAppID = Shell("C:\WORD\WINWORD.EXE", 1) ' Запускает Microsoft Word.

AppActivate MyAppID ' Активизирует Microsoft Word.

ReturnValue = Shell("c:\EXCEL\EXCEL.EXE",1) ' Запускает Microsoft Excel.

AppActivate ReturnValue ' Активизирует Microsoft Excel.

Шаг 4 - Инструкция Beep

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

Beep

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

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

Dim I

For I = 1 To 3 ' Цикл выполняется 3 раза.

Beep ' Подача звукового сигнала.

Next I

Шаг 5 - Инструкция Call

Передает управление в процедуру Sub, процедуру Function или процедуру библиотеки динамической компоновки (DLL).

Call имя [списокАргументов]

Параметры: имя : Обязательный. Имя вызываемой процедуры. списокАргументов : Необязательный.

Разделяемый запятыми список переменных, массивов или выражений, передаваемых в процедуру. Компоненты спискаАргументов могут включать ключевые слова ByVal или ByRef для описания того, каким образом аргументы будут рассматриваться вызываемой процедурой. Однако ключевые слова ByVal и ByRef могут использоваться с инструкцией Call только при вызове процедуры из библиотеки динамической компоновки.

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

Пример В данном примере показано, как использовать инструкцию Call для передачи управления процедуре Sub, внутренней функции, процедуре библиотеки динамической компоновки (DLL) и процедуре программного ресурса Macintosh.

' Вызов процедуры Sub.

Call PrintToDebugWindow("Всем привет")

' Предыдущая инструкция передает управление следующей процедуре Sub.

Sub PrintToDebugWindow(AnyString)

Debug.Print AnyString ' Вывод в окно отладки.

End Sub

' Вызов внутренней функции. Значение, возвращаемое этой функцией,

' не используется.

Call Shell(AppName, 1) ' AppName содержит путь к выполняемому файлу.

' Вызов процедуры DLL Microsoft Windows. Инструкция Declare должна

' быть личной (Private) в модуле класса, но не в стандартном модуле.

Private Declare Sub MessageBeep Lib "User" (ByVal N As Integer)

Sub CallMyDll()

Call MessageBeep(0) ' Вызов процедуры Windows DLL.

MessageBeep 0 ' Повторный вызов без ключевого слова Call.

End Sub

' Вызов программного ресурса Macintosh.

Declare Sub MessageAlert Lib "MyHd:MyAlert" Alias "MyAlert" (ByVal N _

As Integer)

Sub CallMyCodeResource()

Call MessageAlert(0) ' Вызов программного ресурса Macintosh.

MessageAlert 0 ' Повторный вызов без ключевого слова Call.

End Sub

Шаг 6 - Инструкция ChDir

Изменяет текущий каталог или папку.

ChDir путь

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

Замечания Инструкция ChDir изменяет стандартный каталог, но не изменяет стандартный диск. Например, если стандартным является диск C, то после выполнения следующей инструкции стандартным каталогом станет каталог на диске D, однако стандартным диском останется диск C:.

ChDir "D:\TMP"

Пример В данном примере инструкция ChDir используется для изменения текущего каталога или папки.

' Изменяет текущий каталог или папку на "MYDIR".

ChDir "MYDIR"

' В Microsoft Windows:

' Пусть текущим является диск "C:". Следующая инструкция изменяет

' каталог на диске "D:". "C:" остается текущим диском.

ChDir "D:\WINDOWS\SYSTEM"

' На Macintosh:

' Изменяет текущую папку и текущий диск.

ChDir "HD:MY FOLDER"

Шаг 7 - Инструкция ChDrive

Изменяет текущий диск.

ChDrive диск

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

Пример В данном примере инструкция ChDrive используется для изменения текущего диска.

' В Microsoft Windows:

ChDrive "D" ' Сделает диск "D" текущим.

' На Macintosh:

' Сделает диск "MY DRIVE" текущим.

ChDrive "MY DRIVE:"

' Сделает текущими диск "MY DRIVE" и текущую папку,

' поскольку она является корневой.

ChDrive "MY DRIVE:MY FOLDER"

Шаг 8 - Инструкция Close

Завершает операции ввода/вывода с файлом, открытым с помощью инструкции Open.

Close [списокНомеровФайлов]

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

[[#]номерФайла] [, [#]номерФайла] . . .

Замечания Если аргумент списокНомеровФайлов опущен, закрываются все активные файлы, открытые с помощью инструкции Open. При закрытии файла, открытого в режиме Output или Append, в него добавляется содержимое последнего буфера вывода. Все буферы, связанные с закрытым файлом, освобождаются. Инструкция Close разрывает связь между файлом и соответствовавшим ему номером файла.

Пример В данном примере инструкция Close используется для закрытия трех файлов, открытых в режиме Output.

Dim I, FileName

For I = 1 To 3 ' Цикл выполняется 3 раза.

FileName = "TEST" & I ' Создает имя файла.

Open FileName For Output As #I ' Открывает файл.

Print #I, "Пример." ' Записывает строку в файл.

Next I

Close ' Закрывает все 3 открытых файла.

Шаг 9 - Инструкция Const

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

[Public | Private] Const имяКонстанты [As тип] = выражение

Параметры: Public : Необязательный. Ключевое слово, используемое на уровне модуля для описания констант, доступных всем процедурам во всех модулях. Не допускается в процедурах. Private : Необязательный. Ключевое слово, используемое на уровне модуля для описания констант, доступных только внутри модуля, в котором выполняется описание. Не допускается в процедурах. ИмяКонстанты: Обязательный. Имя константы, удовлетворяющее стандартным правилам именования переменных. Тип : Необязательный. Один из поддерживаемых типов данных: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String или Variant. Для каждой описываемой константы следует использовать отдельное предложение As тип. Выражение: Обязательный. Литерал, другая константа или любое сочетание, которое включает все арифметические или логические операторы за исключением Is.

Замечания Константы по умолчанию являются личными. Внутри процедур константы всегда являются личными; их видимость не может быть изменена. В стандартных модулях видимость, которую по умолчанию имеют константы на уровне модуля, может быть изменена с помощью ключевого слова Public. В модулях класса, однако, константы могут быть только личными, и их видимость не может быть изменена с помощью ключевого слова Public. Имеется возможность объединять несколько описаний констант на одной строке, разделяя инструкцию присвоения каждой константы с помощью запятой. Если описания констант объединяются таким образом, используемое ключевое слово Public или Private применяется ко всем константам на строке. Не допускается использование переменных, определяемых пользователем функций или внутренних функций языка Visual Basic (типа Chr) в выражениях, присваиваемых константам. Константы помогают сделать программы самодокументируемыми и легко доступными для исправлений. В отличие от переменных константы не могут непредсказуемым образом изменяться при выполнении программы. Если тип константы не задается явным образом (с помощью предложения As тип), константа приобретает тип, наиболее подходящий заданному выражению. Константы, описанные в процедурах Sub, Function или Property являются локальными для этих процедур. Областью определения константы, описанной вне процедуры, является модуль, в котором она описана. В любом месте, в котором возможно использование выражений, допускается использование и констант.

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

' По умолчанию константы являются личными (Private).

Const MyVar = 459

' Объявляет общую (Public) константу.

Public Const MyString = "СПРАВКА"

' Объявляет личную (Private) целую (Integer) константу.

Private Const MyInt As Integer = 5

' Объявляет несколько констант в одной строке.

Const MyStr = "Привет", MyDouble As Double = 3.4567

Шаг 10 - Инструкция Date

Устанавливает текущую системную дату:

Date = дата

Параметры: дата Для компьютеров, работающих под управлением Microsoft Windows 95, аргумент дата должен задавать дату в интервале от 1 января 1980 года до 31 декабря 2099 года. Для компьютеров, работающих под управлением Microsoft Windows NT, дата в интервале от 1 января 1980 года до 31 декабря 2079 года.

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

Dim MyDate

MyDate = #February 12, 1985# ' Присваивает дату.

Date = MyDate ' Изменяет системную дату.

Шаг 11 - Инструкция Declare

Применяется на уровне модуля ссылок на внешние процедуры в библиотеке динамической компоновки (DLL).

[Public | Private] Declare Sub имя Lib "имяБиблиотеки" [Alias "псевдоним"] [([списокАргументов])]

[Public | Private] Declare Function имя Lib "имяБиблиотеки" [Alias "псевдоним"] [([списокАргументов])] [As тип]

Параметры: Public : Необязательный. Используется для описания процедур, которые доступны для всех других процедур во всех модулях. Private : Необязательный. Используется для описания процедур, которые доступны только в модуле, в котором выполняется описание. Sub: Необязательный (должно быть указано одно из ключевых слов Sub или Function). Указывает, что процедура не возвращает значение. Function : Необязательный (должно быть указано одно из ключевых слов Sub или Function). Указывает, что процедура возвращает значение, которое может быть использовано в выражении. Имя : Обязательный. Любое допустимое имя процедуры. Следует помнить, что вход в библиотеки динамической компоновки осуществляется с учетом регистра. Lib : Обязательный. Указывает, что описываемая процедура содержится в библиотеке динамической компоновки или в программном ресурсе. Предложение Lib обязательно для каждого описания. ИмяБиблиотеки : Обязательный. Имя библиотеки динамической компоновки или программного ресурса, которые содержат описываемую процедуру. Alias : Необязательный. Указывает, что вызываемая процедура имеет другое имя в библиотеке динамической компоновки. Это полезно, когда имя внешней процедуры совпадает с ключевым словом. Имеет смысл использовать Alias и в том случае, когда имя процедуры библиотеки динамической компоновки совпадает с именем общей переменной, константы или любой другой процедуры в той же области определения. Alias полезен также, если некоторые символы в имени процедуры библиотеки динамической компоновки не соответствуют правилам именования для библиотек динамической компоновки. Псевдоним : Необязательный. Имя процедуры в библиотеке динамической компоновки или в программном ресурсе. Если первым символом не является символ (#), псевдоним является именем точки входа процедуры в библиотеке динамической компоновки. Если символ (#) является первым символом, все последующие символы должны указывать порядковый номер точки входа в процедуру. СписокАргументов : Необязательный. Список переменных, представляющий аргументы, которые передаются в процедуру при ее вызове. Аргумент списокАргументов имеет следующий синтаксис и элементы:

  • Optional - Необязательный. Указывает, что этот аргумент необязателен. При использовании этого элемента все последующие аргументы, которые содержит списокАргументов, также должны быть необязательными и быть описаны с помощью ключевого слова Optional. Не допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray.

  • ByVal - Необязательный. Указывает, что этот аргумент передается по значению.

  • ByRef - Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в Visual Basic по умолчанию.

  • ParamArray - Необязательный. Используется только в качестве последнего элемента в списке списокАргументов для указания, что конечным аргументом является массив типа Optional элементов типа Variant. Ключевое слово ParamArray позволяет передавать произвольное число аргументов. Это ключевое слово не может использоваться со словами ByVal, ByRef или Optional.

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

  • Тип - Необязательный. Тип данных аргумента, передаваемого в процедуру; допускаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только строки переменной длины), Object, Variant, определяемый пользователем тип или объектный тип.

Тип : Необязательный. Тип данных значения, возвращаемого процедурой Function; допускаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (только строки переменной длины), Variant, определяемый пользователем тип или объектный тип.

Замечания Для процедур Function тип данных процедуры определяет тип возвращаемых данных. Воспользуйтесь предложением As после элемента списокАргументов, чтобы определить тип данных, возвращаемых функцией. Внутри элемента списокАргументов можно использовать предложение As для задания типа данных любого из аргументов, передаваемых в процедуру. В дополнение к указанию любого стандартного типа данных, предложение As Any в аргументе списокАргументов позволяет приостановить проверку типа данных и разрешить передачу в процедуру любого типа данных. Пустые скобки указывают, что процедура Sub или Function не имеет аргументов, и что в конструкции Visual Basic следует обеспечить отсутствие передачи аргументов. В следующем примере, процедура First не имеет аргументов. Если при вызове процедуры First будут заданы аргументы, возникнет ошибка:

Declare Sub First Lib "MyLib" ()

Если список аргументов включен в описание, то число и тип аргументов проверяются при каждом вызове процедуры. В следующем примере процедура First имеет один аргумент типа Long:

Declare Sub First Lib "MyLib" (X As Long)

Невозможно использование строк фиксированной длины в списке аргументов инструкции Declare, в процедурах допускается передача только строк переменной длины. Строки фиксированной длины могут быть аргументами процедуры, но они преобразуются перед их передачей в строки переменной длины. В языке Visual Basic имеется константа vbNullString для использования при вызове внешних процедур, когда внешней процедуре требуется строка без значения. Это не то же самое, что пустая строка ("").

Пример В данном примере показано, как использовать инструкцию Declare на уровне модуля в стандартном модуле для описания ссылки на внешнюю процедуру из библиотеки динамической компоновки (DLL) или на программный ресурс Macintosh. Инструкции Declare могут быть помещены в модули класса, если они являются личными (Private).

' В Microsoft Windows (16-разрядной):

Declare Sub MessageBeep Lib "User" (ByVal N As Integer)

' Пусть SomeBeep является псевдонимом для имени процедуры.

Declare Sub MessageBeep Lib "User" Alias "SomeBeep"(ByVal N As Integer)

' Для вызова GetWinFlags в предложении Alias

' используется порядковый номер.

Declare Function GetWinFlags Lib "Kernel" Alias "#132"() As Long

' В 32-разрядной Microsoft Windows используется библиотека USER32.DLL,

' а не USER.DLL. Для написания программы, способной работать в 32- или

' 16- разрядной Microsoft Windows, используется условная компиляция.

#If Win32 Then

Declare Sub MessageBeep Lib "User32" (ByVal N As Long)

#Else

Declare Sub MessageBeep Lib "User" (ByVal N As Integer)

#End If

' На Macintosh:

Declare Sub MessageAlert Lib "MyHd:MyAlert" Alias "MyAlert" (ByVal N _

As Integer)

' В предложении Alias используется ресурс программы.

Declare Sub MessageAlert Lib "MyHd:MyAlert" Alias "XTST$MyAlert" _

(ByVal N As Integer)

' Если указатель типа ресурса программы содержит только три символа,

' пробел на месте четвертого символа является обязательным.

Declare Sub MessageAlert Lib "MyHd:AnAlert" Alias "COD $AnAlert" _

(ByVal N As Integer)

Шаг 12 - Инструкции DefТип

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

DefBool диапазонБукв[, диапазонБукв] . . .

DefByte диапазонБукв[, диапазонБукв] . . .

DefInt диапазонБукв[, диапазонБукв] . . .

DefLng диапазонБукв[, диапазонБукв] . . .

DefCur диапазонБукв[, диапазонБукв] . . .

DefSng диапазонБукв[, диапазонБукв] . . .

DefDbl диапазонБукв[, диапазонБукв] . . .

DefDec диапазонБукв[, диапазонБукв] . . .

DefDate диапазонБукв[, диапазонБукв] . . .

DefStr диапазонБукв[, диапазонБукв] . . .

DefObj диапазонБукв[, диапазонБукв] . . .

DefVar диапазонБукв[, диапазонБукв] . . .

Параметры : диапазонБукв : Обязательный аргумент диапазонБукв имеет следующий синтаксис:

буква_1[-буква_2]

Аргументы буква_1 и буква_2 указывают диапазон имен, для которых задается тип данных по умолчанию. Каждый аргумент представляет первую букву имени переменной, аргумента, процедуры Function или Property Get и может быть любой буквой алфавита. Регистр символов в аргументе диапазонБукв не существенен.

Замечания Имя инструкции определяет тип данных:

DefBool Boolean

DefByte Byte

DefInt Integer

DefLng Long

DefCur Currency

DefSng Single

DefDbl Double

DefDec Decimal (в настоящее время не поддерживается)

DefDate Date

DefStr String

DefObj Object

DefVar Variant

Например, в следующем фрагменте программы ,b>Message представляет собой строковую переменную:

DefStr A-Q

. . .

Message = "Переполнение стека."

Инструкция DefТип действует только на модуль, в котором она используется. Например, инструкция DefInt в одном модуле действует только на типы данных по умолчанию для переменных, передаваемых в процедуры аргументов, и возвращаемых типов процедур Function и Property Get, описанных в данном модуле. Типы данных по умолчанию для переменных, передаваемых в процедуры аргументов, и возвращаемых типов данных в других модулях остаются без изменений. Если тип данных не описан явно с помощью инструкции DefТип, то для всех переменных, аргументов, процедур Function и Property Get по умолчанию используется тип данных Variant. При указании диапазона букв обычно определяется тип данных по умолчанию для переменных, которые начинаются с первых 128 символов набора. Однако при указании диапазона A – Z задается тип данных по умолчанию для всех переменных, включая те, что начинаются с международных символов из расширенной части набора (128 – 255). После указания диапазона A – Z имеется возможность переопределять с помощью инструкций DefТип подчиненные диапазоны переменных. Если после задания диапазона включить ранее определенную букву в другую инструкцию DefТип, возникает ошибка. Однако возможно явное указание типа данных любой определенной или не определенной ранее переменной с помощью инструкции Dim с предложением As тип. Например, имеется возможность использовать следующую программу на уровне модуля для определения переменной с типом Double, хотя был задан тип данных по умолчанию Integer:

DefInt A-Z

Dim TaxRate As Double

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

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

' Переменные, имена которых начинаются с букв "A" - "K",

' будут по умолчанию Integer.

DefInt A-K

' Переменные, имена которых начинаются с букв "L" - "Z",

' будут по умолчанию String.

DefStr L-Z

CalcVar = 4 ' Инициализирует переменную типа Integer.

StringVar = "Всем привет" ' Инициализирует переменную типа String.

AnyVar = "Привет" ' Будет обнаружено несовпадение типов.

Dim Calc As Double ' Явно объявлена переменная типа Double.

Calc = 2.3455 ' Присваивает значение переменной типа Double.

' Инструкции Defтип также применимы к функциям.

CalcNum = ATestFunction(4) ' Вызывает процедуру Function, определенную пользователем.

' Описание процедуры Function ATestFunction.

Function ATestFunction(INumber)

ATestFunction = INumber * 2 ' Возвращает значение типа Integer.

End Function

Шаг 13 - Инструкция DeleteSetting

Удаляет раздел или запись из раздела приложения в реестре Windows.

DeleteSetting appname, section[, key]

Параметры : appname : Обязательный. Строковое выражение, содержащее имя приложения или проекта, к которому относится раздел или запись. Section : Обязательный. Строковое выражение, содержащее имя раздела, в котором удаляется запись. Если определены только аргументы appname и section, указанный раздел удаляется полностью со всеми записями. Key : Необязательный. Строковое выражение, содержащее имя удаляемой записи.

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

Пример В данном примере сначала с помощью инструкции SaveSetting заполняются элементы реестра Windows (или файла .INI на 16-разрядных платформах Windows) для приложения MyApp, а затем инструкция DeleteSetting вызывается для их удаления. Поскольку аргумент key не определен, удаляется весь раздел, в том числе имя раздела и все содержащиеся в нем записи.

' Заполнение реестра.

SaveSetting appname := "MyApp", section := "Startup", _

key := "Top", setting := 75

SaveSetting "MyApp","Startup", "Left", 50

' Удаление из реестра раздела со всем содержимым.

DeleteSetting "MyApp", "Startup"

Шаг 14 - Инструкция Dim

Описывает переменные и выделяет для них память.

Dim [WithEvents] имяПеременной[([индексы])] [As [New] тип] [, [WithEvents] имяПеременной[([индексы])] [As [New] тип]] . . .

Параметры : WithEvents : Необязательный. Ключевое слово, указывающее, что имяПеременной является объектной переменной, которая используется при отклике на события, генерируемые объектом ActiveX. Применяется только в модулях класса. Пользователь имеет возможность описать с помощью ключевого слова WithEvents произвольное количество отдельных переменных, однако при этом не допускается создание массивов. Не допускается также использование ключевого слова New с ключевым словом WithEvents. ИмяПеременной : Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных. индексы : Необязательный. Размерности переменной массива; допускается описание до 60 размерностей. Для задания аргумента индексы используется следующий синтаксис:

[нижний To] верхний [, [нижний To] верхний] . . .

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

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

тип Необязательный. Тип данных переменной; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (для строк переменной длины), String* длина (для строк фиксированной длины), Object, Variant, определяемый пользователем тип или объектный тип. Для каждой описываемой переменной следует использовать отдельное предложение As тип.

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

Dim NumberOfEmployees As Integer

Инструкция Dim предназначена также для описания объектного типа переменных. Далее приводится описание переменной для нового образца листа электронной таблицы.

Dim X As New Worksheet

Если при описании объектной переменной не используется ключевое слово New, то для использования объекта, на который ссылается переменная, существующий объект должен быть с помощью инструкции Set присвоен переменной. До присвоения объекта описанная объектная переменная имеет специальное значение Nothing, которое указывает, что она не содержит ссылку на какой-либо определенный экземпляр объекта. Имеется также возможность применять инструкцию Dim с пустыми скобками для описания динамического массива. После описания динамического массива, воспользуйтесь инструкцией ReDim в процедуре для определения числа размерностей и элементов массива. При попытке переопределить размерности переменной-массива, чей размер был явно указан в инструкции Private, Public или Dim, возникает ошибка. Если тип данных или тип объекта не задан, и в модуле отсутствует инструкция DefТип, по умолчанию переменная получает тип Variant. При инициализации переменных числовая переменная получает значение 0, строка переменной длины получает значение пустой строки (""), а строка фиксированной длины заполняется нулями. Переменные типа Variant получают при инициализации значение Empty. Каждый элемент переменной определяемого пользователем типа при инициализации получает значение, которые он получил бы, если бы являлся отдельной переменной. При использовании инструкции Dim в процедуре ее обычно помещают в начало процедуры.

Пример В данном примере инструкция Dim используется для объявления переменных и массивов. По умолчанию нижняя граница индексов массива равняется 0; для ее изменения следует использовать инструкцию Option Base на уровне модуля.

' По умолчанию AnyValue и MyValue являются переменными типа Variant

' и имеют пустые значения.

Dim AnyValue, MyValue

' Явно объявляет переменную типа Integer.

Dim Number As Integer

' Несколько объявлений на одной строке. AnotherVar является переменной

' типа Variant, поскольку ее тип опущен.

Dim AnotherVar, Choice As Boolean, BirthDate As Date

' DayArray является массивом, состоящим из 51 элемента типа Variant.

' Индексы элементов массива лежат в диапазоне от 0 до 50, если для

' текущего модуля используемая по умолчанию нижняя граница элементов

' массива (0) не изменена с помощью инструкции Option Base.

Dim DayArray(50)

' Matrix является двумерным массивом значений типа Integer.

Dim Matrix(3, 4) As Integer

' MyMatrix является трехмерным массивом значений типа Double с явно

' заданными границами индексов.

Dim MyMatrix(1 To 5, 4 To 9, 3 To 5) As Double

' BirthDay является массивом дат с индексами от 1 до 10.

Dim BirthDay(1 To 10) As Date

' MyArray является динамическим массивом значений типа Variant.

Dim MyArray()

Шаг 15 - Инструкция Do...Loop

Повторяет выполнение набора инструкций, пока условие имеет значение True или пока оно не примет значение True.

Do [{While | Until} условие]

[инструкции]

[Exit Do]

[инструкции]

Loop

Do

[инструкции]

[Exit Do]

[инструкции]

Loop [{While | Until} условие]

Параметры условие : Необязательный. Числовое выражение или строковое выражение, которое имеет значение True или False. Если условие имеет значение Null,то аргумент условие рассматривается как значение False. инструкции Одна или несколько инструкций, выполнение которых повторяется, пока условие имеет значение True или пока оно не приобретет значение True.

Замечания В любом месте управляющей структуры Do…Loop может быть размещено любое число инструкций Exit Do, обеспечивающих альтернативные возможности выхода из цикла Do…Loop. Часто используемая вместе с определением некоторого условия (например, If…Then), инструкция Exit Do передает управление инструкции, непосредственно следующей за инструкцией Loop. Во вложенных циклах Do…Loop инструкция Exit Do передает управление циклу охватывающего уровня по отношению к циклу, в котором она вызывается.

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

Do ' Внешний цикл.

Do While Counter < 20 ' Внутренний цикл.

Counter = Counter + 1 ' Увеличивает счетчик.

If Counter = 10 Then ' Если условие истинно.

Check = False ' Присваивает переменной

' значение False.

Exit Do ' Завершает внутренний цикл.

End If

Loop

Loop Until Check = False ' Немедленно завершает внешний цикл.

Шаг 16 - Инструкция End

Завершает процедуру или блок.

  • End - Завершает выполнение. Никогда не является обязательной, но может быть помещена в любое место процедуры для закрытия файлов, открытых с помощью инструкции Open, и для очистки переменных.

  • End Function - Обязательная инструкция для завершения конструкции Function.

  • End If - Обязательная инструкция для завершения конструкции If…Then…Else.

  • End Property - Обязательная инструкция для завершения конструкций Property Let, Property Get или Property Set.

  • End Select - Обязательная инструкция для завершения конструкции Select Case.

  • End Sub - Обязательная инструкция для завершения конструкции Sub.

  • End Type - Обязательная инструкция для завершения описания определяемого пользователем типа (конструкция Type).

  • End With - Обязательная инструкция для завершения конструкции With.

Замечания При выполнении инструкции End производится сброс всех переменных на уровне модуля и всех статических локальных переменных во всех модулях. Если требуется сохранить значения этих переменных, следует использовать инструкцию Stop. Затем можно возобновить выполнение с использованием сохраненных значений этих переменных. Инструкция End мгновенно останавливает выполнение программы, не вызывая события Unload, QueryUnload или Terminate, а также другую программу Visual Basic. Программы, связанные с событиями Unload, QueryUnload и Terminate форм и модулей классов, не выполняются. Созданные из модулей классов объекты уничтожаются, открытые инструкцией Open файлы закрываются, а использованная программой память освобождается. Ссылки на объекты, содержащиеся в других программах, нарушаются. Инструкция End предоставляет способ вызвать непредусмотренную остановку программы. Для нормального завершения программы Visual Basic необходимо выгрузить все формы. Программа закрывается, как только не станет других программ, содержащих ссылки на объекты, созданные из общих модулей классов, и отсутствует выполнение кода программы.

Пример В данном примере инструкция End используется для завершения выполнения программы, если пользователь введет неправильный пароль.

Sub Form_Load

Dim Password, Pword

PassWord = "МОЙ_ПАРОЛЬ"

Pword = InputBox("Введите пароль”)

If Pword <> PassWord Then

MsgBox "Неправильный пароль"

End

End If

End Sub

Шаг 17 - Инструкция Erase

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

Erase списокМассивов

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

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

  • Массив чисел - Присваивает каждому элементу значение 0.

  • Массив строк(переменной длины) - Присваивает каждому элементу значение пустой строки ("").

  • Массив строк(фиксированной длины) - Присваивает каждому элементу значение нуля.

  • Массив типа Variant - Присваивает каждому элементу значение Empty.

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

  • Массив объектов - Присваивает каждому элементу специальное значение Nothing.

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

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

' Объявляет переменные-массивы.

Dim NumArray(10) As Integer ' Массив значений типа Integer.

Dim StrVarArray(10) As String ' Массив строк переменной длины.

Dim StrFixArray(10) As String * 10 ' Массив строк фиксированной длины.

Dim VarArray(10) As Variant ' Массив типа Variant.

Dim DynamicArray() As Integer ' Динамический массив.

ReDim DynamicArray(10) ' Занимает память.

Erase NumArray ' Каждый элемент становится равным 0.

Erase StrVarArray ' Каждый элемент становится пустой строкой ("").

Erase StrFixArray ' Каждый элемент становится равным 0.

Erase VarArray ' Каждый элемент становится пустым.

Erase DynamicArray ' Освобождает память, используемую массивом.

Шаг 18 - Инструкция Error

Имитирует возникновение ошибки.

Error кодОшибки

Параметры kодОшибки : Обязательный аргумент кодОшибки может представлять любое допустимое значение кода ошибки.

Замечания Инструкция Error поддерживается для совместимости с предыдущими версиями. В новой программе, в особенности при создании объектов, следует применять для создания ошибок выполнения метод Raise объекта Err. Если аргумент кодОшибки определен, инструкция Error заполняет свойства объекта Err значениями по умолчанию (перечисленными в следующей таблице), после чего вызывает обработчик ошибок:

  • Number - Значение, указанное в аргументе инструкции Error. Любой допустимый код ошибки.

  • Source - Имя текущего проекта Visual Basic.

  • Описание - Строковое выражение, соответствующее значению, возвращаемому функцией Error для кода ошибки, указанного в свойстве Number, если такая строка сообщения существует. Если возвращаемое сообщение не определено, значением свойства Description становится пустая строка ("").

  • HelpFile - Полное имя (включая диск им путь) соответствующего файла справочной системы Visual Basic.

  • HelpContext - Контекстный идентификатор раздела файла справочной системы Visual Basic, соответствующего ошибке с кодом Number.

  • LastDLLError - Нуль.

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

Пример В данном примере инструкция Error используется для имитации ошибки с кодом 11.

On Error Resume Next ' Отложенный перехват ошибок.

Error 11 ' Имитация ошибки "Деление на нуль".

Шаг 19 - Инструкция Exit

Завершает выполнение блока программы Do…Loop, For...Next, Function, Sub или Property.

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

  • Exit For - Предоставляет способ завершения цикла For. Может применяться только в цикле For...Next или For Each...Next. Exit For передает управление инструкции, следующей за инструкцией Next. При использовании во вложенных циклах For, инструкция Exit For передает управление циклу охватывающего уровня по отношению к циклу, в котором она вызывается.

  • Exit Function - Немедленно завершает выполнение процедуры Function, в которой появляется эта инструкция. Выполнение продолжается с инструкции, следующей за инструкцией, в которой вызывалась процедура Function.

  • Exit Property - Немедленно завершает выполнение процедуры Property, в которой появляется эта инструкция. Выполнение продолжается с инструкции, следующей за инструкцией, в которой вызывалась процедура Property.

  • Exit Sub - Немедленно завершает выполнение процедуры Sub, в которой появляется эта инструкция. Выполнение продолжается с инструкции, следующей за инструкцией, в которой вызывалась процедура Sub.

Замечания Не следует путать инструкции Exit с инструкциями End. Инструкция Exit не определяет конец структуры.

Пример В данном примере инструкция Exit используется для завершения цикла For...Next, цикла Do...Loop и процедуры Sub.

Sub ExitStatementDemo()

Dim I, MyNum

Do ' Бесконечный цикл.

For I = 1 To 1000 ' Цикл выполняется 1000 раз.

MyNum = Int(Rnd * 1000) ' Генерирует случайное число.

Select Case MyNum ' Анализирует случайное число.

Case 7: Exit For ' Если 7, завершает цикл For...Next.

Case 29: Exit Do ' Если 29, завершает цикл Do...Loop.

Case 54: Exit Sub ' Если 54, завершает процедуру Sub.

End Select

Next I

Loop

End Sub

Шаг 20 - Инструкция FileCopy

Копирует файл.

FileCopy source, destination

Параметры source : Обязательный. Строковое выражение, указывающее имя файла, подлежащего копированию. Аргумент source может содержать имя каталога или папки и диска. Destination : Обязательный. Строковое выражение, указывающее имя результирующего файла. Аргумент destination может содержать имя каталога или папки и диска.

Замечания При попытке скопировать открытый файл с помощью инструкции FileCopy возникает ошибка.

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

Dim SourceFile, DestinationFile

SourceFile = "SRCFILE" ' Файл-источник.

DestinationFile = "DESTFILE" ' Файл-адресат.

FileCopy SourceFile, DestinationFile ' Копирует файл.

Шаг 21 - Инструкция For Each...Next

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

For Each элемент In группа

[инструкции]

[Exit For]

[инструкции]

Next [элемент]

Параметры элемент : Обязательный. Переменная, используемая для выполнения итераций по элементам семейства или массива. Для семейств элемент может быть только переменной типа Variant, универсальной объектной переменной или переменной, представляющей любой конкретный объект. Для массивов элемент может быть только переменной типа Variant. Группа : Обязательный. Имя семейства объектов или массива (за исключением массивов с определяемыми пользователем типами). Инструкции : Необязательный. Одна или несколько инструкций, которые выполняются над каждым элементом группы.

Замечания Вход в блок For...Each выполняется только в том случае, если группа содержит хотя бы один элемент. После входа в цикл все инструкции цикла выполняются для первого элемента группы. Затем, если группа содержит другие элементы, инструкции цикла выполняются для каждого элемента. После обработки всех элементов цикл завершается, а выполнение продолжается с инструкции, следующей за инструкцией Next. В любых местах цикла может размещаться любое число инструкций Exit For, позволяющих выйти из цикла. Инструкция Exit For часто применяется вместе с проверкой некоторого условия (например, If…Then). Она передает управление инструкции, непосредственно следующей за инструкцией Next. Допускается организация вложенных циклов For...Each...Next (один цикл For...Each...Next располагается внутри другого). Однако каждый элемент цикла должен быть уникальным. Если опустить элемент в инструкции Next, выполнение продолжается так же, как если бы элемент был указан. При обнаружении инструкции Next до соответствующей инструкции For возникает ошибка. Не допускается использование инструкции For...Each...Next с массивами, определяемых пользователями типов, поскольку значение типа Variant не может содержать тип, определяемый пользователем.

Пример В данном примере инструкция For Each...Next просматривает свойство Text каждого элемента семейства, чтобы найти строку "Привет". В данном примере MyObject - объект, который имеет свойство Text и является элементом семейства MyCollection. Оба имени используются исключительно в иллюстративных целях.

Dim Found, MyObject, MyCollection

Found = False ' Инициализирует переменную.

For Each MyObject In MyCollection ' Просматривает каждый элемент.

If MyObject.Text = "Привет" Then ' Если Text содержит "Привет",

Found = True ' Присваивает значение True.

Exit For ' Завершает цикл.

End If

Next

Шаг 22 - Инструкция For...Next

Повторяет выполнение группы инструкций указанное число раз.

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

[инструкции]

[Exit For]

[инструкции]

Next [счетчик]

Параметры счетчик : Обязательный. Числовая переменная, используемая в качестве счетчика цикла. Эта переменная не может принадлежать к типу Boolean или быть элементом массива. Начало : Обязательный. Начальное значение переменной счетчик. Конец : Обязательный. Конечное значение переменной счетчик. Шаг : Необязательный. Значение, на которое изменяется счетчик при каждом выполнении тела цикла. Если это значение не задано, по умолчанию шаг равен единице. Инструкции : Необязательный. Одна или несколько инструкций между For и Next, которые выполняются указанное число раз.

Замечания Аргумент шаг может быть как положительным, так и отрицательным. Значение этого аргумента следующим образом определяет выполнение цикла:

Положительное или 0 счетчик <= конец

Отрицательное счетчик >= конец

После выполнения всех инструкций цикла значение шаг добавляется к текущему значению переменной счетчик. После этого инструкции цикла либо выполняются еще раз (на основе того же условия, которое привело к начальному выполнению цикла), либо цикл завершается и выполнение продолжается с инструкции, следующей за инструкцией Next. Изменение значения переменной счетчик внутри цикла усложняет чтение и отладку программы. Альтернативный способ выхода из цикла предоставляет инструкция Exit For. В любых местах цикла может размещаться любое число таких инструкций. Инструкция Exit For часто применяется вместе с проверкой некоторого условия (например, If...Then). Эта инструкция передает управление инструкции, непосредственно следующей за инструкцией Next. Допускается организация вложенных циклов For...Next (один цикл For...Next располагается внутри другого). Счетчик каждого цикла должен иметь уникальное имя. Допускаются следующие конструкции:

For I = 1 To 10

For J = 1 To 10

For K = 1 To 10

...

Next K

Next J

Next I

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

Пример В данном примере инструкция For...Next используется для создания строки, содержащей 10 наборов по 10 цифр (от 0 до 9); каждый набор отделяется от следующего одним пробелом. Внешний цикл использует переменную-счетчик, которая уменьшается на единицу при каждом выполнении цикла.

Dim Words, Chars, MyString

For Words = 10 To 1 Step -1 ' Цикл выполняется 10 раз.

For Chars = 0 To 9 ' Цикл выполняется 10 раз.

MyString = MyString & Chars ' Добавляет цифру в конец строки.

Next Chars ' Увеличивает счетчик.

MyString = MyString & " " ' Добавляет пробел.

Next Words

Шаг 23 - Инструкция Function

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

[Public | Private] [Static] Function имя [(списокАргументов)] [As тип]

[инструкции]

[имя = выражение]

[Exit Function]

[инструкции]

[имя = выражение]

End Function

Параметры Public : Необязательный. Указывает, что процедура Function доступна для всех других процедур во всех модулях. При использовании в личном модуле (содержащем инструкцию Option Private) такая процедура недоступна вне проекта. Private : Необязательный. Указывает, что процедура Function доступна для других процедур только того модуля, в котором она описана. Static : Необязательный. Указывает, что локальные переменные процедуры Function сохраняются в промежутках времени между вызовами этой процедуры. Атрибут Static не действует на переменные, описанные вне процедуры Function, даже если они используются в этой процедуре. Имя : Обязательный. Имя процедуры Function, удовлетворяющее стандартным правилам именования переменных. СписокАргументов : Необязательный. Список переменных, представляющий аргументы, которые передаются в процедуру Function при ее вызове. Имена переменных разделяются запятой.

  • Optional - Необязательный. Указывает, что этот аргумент необязателен. При использовании этого элемента все последующие аргументы, которые содержит списокАргументов, также должны быть необязательными и быть описаны с помощью ключевого слова Optional. Не допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray.

  • ByVal - Необязательный. Указывает, что этот аргумент передается по значению.

  • ByRef - Необязательный. Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в Visual Basic по умолчанию.

  • ParamArray - Необязательный. Используется только в качестве последнего элемента в списке списокАргументов для указания, что конечным аргументом является описанный как Optional массив типа Variant. Ключевое слово ParamArray позволяет задавать произвольное количество аргументов. Оно не может быть использовано со словами ByVal, ByRef или Optional.

  • имяПеременной - Обязательный. Имя переменной, удовлетворяющее стандартным правилам именования переменных.

  • тип - Необязательный. Тип данных аргумента, передаваемого в процедуру; допускаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается) Date, String (только строки переменной длины), Object, Variant. Если отсутствует ключевое слово Optional, допускается указание определяемого пользователем типа или объектного типа.

  • поУмолчанию - Необязательный. Любая константа или выражение, дающее константу. Используется только вместе с параметром Optional. Если указан тип Object, единственным значением по умолчанию может быть значение Nothing.

Тип : Необязательный. Тип данных значения, возвращаемого процедурой Function, поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal (в настоящее время не поддерживается), Date, String (за исключением строк фиксированной длины), Object, Variant или любой определяемый пользователем тип. Невозможен возврат массивов любого типа, однако допускается возврат значения типа Variant, содержащего массив. Инструкции : Необязательный. Любая группа инструкций, выполняемых внутри процедуры Function. Выражение : Необязательный. Возвращаемое значение процедуры Function.

Замечания Процедуры Function, не описанные явно с помощью ключевых слов Public или Private, по умолчанию являются общими. Если не используется ключевое слово Static, значения локальных переменных не сохраняются между вызовами. Допускаются рекурсивные процедуры Function; то есть они могут вызывать сами себя для выполнения определенных задач. Однако рекурсия может приводить к переполнению стека. Ключевое слово Static обычно не используется с рекурсивными процедурами Function. Все выполняемые команды должны содержаться в процедурах. Не допускается определение процедуры Function внутри другой процедуры Function, Sub или Property. Инструкция Exit Function приводит к немедленному выходу из процедуры Function. Выполнение программы продолжается с инструкции, следующей за инструкцией, в которой была вызвана процедура Function. В любом месте процедуры Function возможно наличие любого числа инструкций Exit Function. Подобно процедуре Sub, процедура Function является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедуры Sub, когда требуется использовать возвращаемое функцией значение, процедура Function может применяться в правой части выражения, как и любая другая встроенная функция, например, Sqr, Cos или Chr. Процедура Function вызывается в выражении по своему имени, за которым следует список аргументов в скобках. Для получения дополнительных сведений о вызовах процедур Function см. описание инструкции Call. Для возврата значения из функции следует присвоить значение имени функции. Любое число таких инструкций присвоения может находиться в любом месте процедуры. Если имени процедуры не присваивается никакого значения, процедура возвращает значение по умолчанию: числовая функция возвращает нулевое значение, строковая функция возвращает значение пустой строки (""), а функция типа Variant возвращает значение Empty. Функция, которая возвращает ссылку на объект, возвращает значение Nothing, если внутри процедуры Function никакая ссылка на объект не присваивается имени функции с помощью инструкции Set. В следующем примере демонстрируется присвоение возвращаемого значения функции BinarySearch. В этом случае имени присваивается значение False, чтобы указать, что некоторое значение не было найдено.

Function BinarySearch(. . .) As Boolean

. . .

' Значение не найдено. Возвращается значение False.

If lower > upper Then

BinarySearch = False

Exit Function

End If

. . .

End Function

Переменные, используемые в процедурах Function, разбиваются на две категории: явно описанные внутри процедуры и не описанные внутри процедуры. Переменные, которые явно описаны в процедуре (с помощью ключевого слова Dim или эквивалентного ему), всегда являются локальными для этой процедуры. Переменные, которые используются, но явно не описаны в процедуре, также являются локальными, если они явно не описаны на более высоком уровне. В процедуре допускается использование переменной, которая явно не описана в этой процедуре, но при этом может возникать конфликт имен, если на уровне модуля был определен элемент с тем же самым именем. Если в процедуре содержится ссылка на неописанную переменную, имя которой совпадает с именем другой процедуры, константы или переменной, то подразумевается, что процедура ссылается на это имя на уровне модуля. Чтобы избежать возникновения конфликтов такого рода, следует пользоваться явным описанием переменных. Для включения обязательного явного описания переменных используется инструкция Option Explicit. В языке Visual Basic возможна реорганизация арифметических выражений для увеличения скорости их выполнения. Избегайте применения процедуры Function в арифметическом выражении, если эта процедура изменяет значения переменных, используемых в этом же выражении.

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

' Следующая функция, определенная пользователем, возвращает

' квадратный корень из переданного ей аргумента.

Function CalculateSquareRoot(NumberArg As Double) As Double

If NumberArg < 0 Then ' Анализирует аргумент.

Exit Function ' Возврат в вызывающую процедуру. Else

CalculateSquareRoot = Sqr(NumberArg) ' Возвращает квадратный корень.

End If

End Function

Ключевое слово ParamArray позволяет функции принимать переменное число аргументов. В следующем описании FirstArg передается по значению.

Function CalcSum(ByVal FirstArg As Integer, ParamArray OtherArgs())

Dim ReturnValue

' Если функция вызывается следующим образом:

ReturnValue = CalcSum(4, 3 ,2 ,1)

' Локальные переменные принимают следующие значения: FirstArg = 4,

' OtherArgs(1) = 3, OtherArgs(2) = 2 и т.п., если нижняя граница

' индексов массивов равняется 1.

Аргументы OptionalVariant.

' Если аргументы функции описаны следующим образом:

Function MyFunc(MyStr As String, Optional MyArg1 As _ Integer = 5, Optional MyArg2 = "Мария")

Dim RetVal

' Функция может быть вызвана следующим образом:

RetVal = MyFunc("Всем", 2, "Привет") ' Указаны все 3 аргумента.

RetVal = MyFunc("Тест", , 5) ' Второй аргумент опущен.

' Первый и третий аргументы(именованные аргументы).

RetVal = MyFunc(MyStr:="Привет ", MyArg1:=7)

Шаг 24 - Инструкция Get

Читает данные из открытого файла на диске в переменную.

Get [#]номерФайла, [номерЗаписи], имяПеременной

Параметры номерФайла : Обязательный. Любой допустимый номер файла. номерЗаписи : Необязательный. Тип Variant(Long). Номер записи (для файлов в режиме Random) или номер байта (для файлов в режиме Binary), с которого следует начать чтение. имяПеременной : Обязательный. Допустимое имя переменной, в которую следует поместить считанные данные.

Замечания Данные, считываемые с помощью инструкции Get, обычно записываются в файл с помощью инструкции Put. Первой записи (или байту) файла соответствует номер 1, второй (или второму) 2 и т.п. Если аргумент номерЗаписи опущен, читается запись (или байт), на которую был установлен указатель после выполнения последней инструкции Get или Put (или переведен при последнем вызове функции Seek). Наличие запятых-разделителей является обязательным, например:

Get #4,,FileBuffer

Для файлов, открытых в режиме Random, применимы следующие правила: Даже если длина данных, подлежащих чтению, меньше длины записи, указанной в предложении Len инструкции Open, инструкция Get начинает чтение каждой следующей записи с начала этой записи. Пространство между концом одной записи и началом следующей записи заполняется текущим содержимым буфера файла. Поскольку объем данных, используемых для заполнения, не может быть определен с достаточной степенью уверенности, рекомендуется, чтобы длина записи совпадала с длиной читаемых данных. Если данные считываются в строку переменной длины, инструкция Get сначала считывает 2-байтовый дескриптор, содержащий длину строки, а затем данные, которые следует поместить в эту переменную. Таким образом, длина записи, указанная в предложении Len инструкции Open, должна быть по крайней мере на 2 байта больше, чем фактическая длина этой строки. Если данные считываются в переменную Variant числового типа, инструкция Get сначала считывает 2 байта, указывающие подтип (VarType) этой переменной, а затем данные, которые следует поместить в эту переменную. Например, при чтении переменной Variant подтипа VarType 3 инструкция Get считывает 6 байт: 2 байта, указывающие подтип переменной Variant как VarType 3 (Long), и 4 байта, содержащие значение типа Long. Длина записи, указанная в предложении Len инструкции Open, должна по крайней мере на 2 байта превышать фактический размер, необходимый для размещения этой переменной. С помощью инструкции Get можно считать массив типа Variant с диска, однако нельзя прочитать скаляр типа Variant, содержащий массив. Кроме того, инструкцию Get нельзя использовать для чтения объектов с диска. Если данные считываются в переменную типа Variant подтипа VarType 8 (String), инструкция Get сначала считывает 2 байта, указывающие VarType, потом 2 байта, указывающие длину строки, а затем содержимое строки. Длина записи, указанная в предложении Len инструкции Open, должна быть по крайней мере на 4 байта больше, чем фактическая длина этой строки. Если данные считываются в динамический массив, инструкция Get сначала считывает дескриптор, длина которого равняется (2 + 8 * числоРазмерностей) байт. Длина записи, указанная в предложении Len инструкции Open , должна быть больше либо равна сумме всех байтов, необходимых для размещения массива данных и дескриптора массива. Например, для размещения описанного ниже массива требуется 118 байт.

Dim MyArray(1 To 5,1 To 10) As Integer

118 байт распределяются следующим образом: 18 для дескриптора (2 + 8 * 2) и 100 байт для данных (5 * 10 * 2). Если данные считываются в массив фиксированного размера, инструкция Get считывает только данные. Дескриптор не считывается. Если данные считываются в переменную любого другого типа (кроме строки переменной длины и переменной типа Variant), инструкция Get считывает только данные. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна длине данных, подлежащих считыванию. Инструкция Get считывает элементы определяемых пользователем типов так, будто это отдельные переменные, за исключением того, что пространство между элементами не заполняется текущим содержимым буфера файла. На диске динамический массив типа, определенного пользователем (записанный с помощью инструкции Put) предваряется дескриптором, длина которого равняется (2 + 8 * числоРазмерностей) байт. Длина записи, указанная в предложении Len инструкции Open, должна быть больше либо равна сумме всех байтов, необходимых для размещения отдельных элементов, в том числе, массивов и их дескрипторов. Для файлов, открытых в режиме Binary, применимы все перечисленные выше правила, за исключением следующих: Предложение Len инструкции Open игнорируется. Инструкция Get считывает все переменные с диска непрерывно, т.е. без заполнения пространства между записями текущим содержимым буфера файла. При чтении любых массивов, кроме являющихся элементами типов, определяемых пользователем, инструкция Get считывает только данные. Дескриптор не считывается. При считывании строк переменной длины, не являющихся элементами типов, определяемых пользователем, 2-байтовый дескриптор не считывается. Число считываемых байт равняется числу символов, уже содержащихся в строке. Например, следующие инструкции считают 10 байт из файла, которому соответствует номер 1:

VarString = String(10," ")

Get #1,,VarString

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

Type Record ' Тип, определенный пользователем.

Id As Integer

Name As String * 20

End Type

Dim MyRecord As Record, Position ' Объявляет переменную.

' Открывает файл произвольного доступа.

Open "TESTFILE" For Random As #1 Len = Len(MyRecord)

' Читает из файла с помощью инструкции Get.

Position = 3 ' Определяет номер записи.

Get #1, Position, MyRecord ' Читает третью запись.

Close #1 ' Закрывает файл.

Шаг 25 - Инструкция GoSub...Return

Задает переход в подпрограмму и возвращение из нее в процедуру.

GoSub строка

...

строка

...

Return

Параметры

Строка :Аргумент строка может быть любой меткой строки или номером строки.

Замечания Допускается использование инструкций GoSub и Return в любом месте процедуры, но GoSub и соответствующая инструкция Return должны находиться в одной процедуре. Подпрограмма может содержать несколько инструкций Return. Первая обнаруженная инструкция Return приводит к передаче управления назад к инструкции, непосредственно следующей за последней выполненной инструкцией GoSub. Невозможен вызов или завершение процедур Sub с помощью GoSub...Return. Создание отдельных процедур для вызова из программы может обеспечить более структурированный подход, чем использование конструкций GoSub...Return.

Пример

В данном примере инструкция GoSub используется для вызова подпрограммы из процедуры Sub. Инструкция Return возвращает управление инструкции, следующей сразу после инструкции GoSub. Инструкция Exit Sub используется, чтобы управление не было случайно передано подпрограмме.

Sub GosubDemo()

Dim Num

' Запрашивает число у пользователя.

Num = InputBox("Введите положительное четное число.")

' Вызывает подпрограмму только в том случае,

' если было введено положительное число.

If Num > 0 Then GoSub MyRoutine

Debug.Print Num

Exit Sub ' Запрещает передачу управления процедуре.

MyRoutine:

Num = Num/2 ' Выполняет деление.

Return ' Возвращает управление инструкции,

End Sub ' следующей после инструкции GoSub.

Шаг 26 - Инструкция GoTo

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

GoTo строка

Параметры строка :Обязательный аргумент строка может быть любой меткой строки или номером строки.

Замечания Инструкция GoTo позволяет переходить только на строки внутри той процедуры, в которой она находится. Слишком большое число инструкций GoTo затрудняет чтение и отладку программ. По возможности следует использовать структурные управляющие инструкции (Do...Loop, For...Next, If...Then...Else, Select Case).

Пример В данном примере инструкция GoTo используется для перехода к строкам с указанными метками внутри процедуры.

Sub GotoStatementDemo()

Dim Number, MyString

Number = 1 ' Инициализирует переменную.

' Анализирует Number и переходит к соответствующей метке.

If Number = 1 Then GoTo Line1 Else GoTo Line2

Line1:

MyString = "Number =1"

GoTo LastLine ' Переход к метке LastLine.

Line2:

' Следующая инструкция не будет выполнена никогда.

MyString = "Number =2"

LastLine:

Debug.Print MyString ' Выводит "Number = 1"

' в окно отладки.

End Sub

Шаг 27 - Инструкция If...Then...Else

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