Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 1....doc
Скачиваний:
59
Добавлен:
17.12.2018
Размер:
1.88 Mб
Скачать

Синтаксис объявления простых переменных

Объявление простых переменных имеет следующий синтаксис:

{Dim | Private | Public | Static }<имя переменной> [ As <имя типа>]

[, <имя переменной> [ As <имя типа>]]…

Вначале идет имя оператора, а потом список объявлений переменных, где роль разделителя играет запятая. Каждое объявление связывает имя переменной с ее типом, заданным конструкцией As. Будьте внимательны, VBA неприятно отличается в этом вопросе от других языков программирования. Здесь, как обычно, одним оператором можно объявить произвольное число переменных, но следует в каждом объявлении указывать конструкцию As, иначе переменным без As будет приписан тип Variant. На наш взгляд, то, что одним As нельзя объявить список переменных одного типа, - некий синтаксический "прокол", приводящий, если не к серьезным ошибкам, то к излишнему и не предполагаемому употреблению типа Variant.

Заметьте, есть и приятное отклонение, - имена переменных в VBA можно задать, используя русский алфавит.

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

'Option Explicit

Public Fx As Byte, Fz As Integer

Private Fy As Integer

Public Sub Start()

'Инициализация глобальных переменных

Fx = 10: Fy = 11: Fz = 12

Mx = 20: My = 21: Mz = 22

Father1

End Sub

Public Sub Father1()

Dim Fz As Byte 'Локальная переменная

Fx = Fx + 2

Fy = Mx - 2

Fz = 1

Debug.Print "Father1: Fx=", Fx, " Fy =", Fy, "Fz =", Fz

'Вызов процедуры другого модуля

Mother1

End Sub

Здесь мы приводим тексты модуля Mother:

'Option Explicit

Public Mx As Byte

Private My As Integer

Public Sub Mother1()

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

Static Count As Byte

Count = Count + 1

Mx = Mx - 2: Fz = My + 2

Debug.Print "Mother: Статическая переменная Count =", Count

'Вызов процедуры Father другого модуля или заключительной - Finish

If Fx < Mx Then Father1 Else Finish

End Sub

Public Sub Finish()

'Заключительная печать

Debug.Print "Finish: Fx = ", Fx, "Fy =", Fy, "Fz =", Fz

Debug.Print "Mx =", Mx, "My =", My, "Mz =", Mz

'Объявления разных типов и печать значений, полученных при объявлении

Dim B As Byte, I As Integer, L As Long

Dim Sng As Single, D As Double, C As Currency

Dim SF As String * 7, SV As String, Dat As Date

Dim O As Object, V

Debug.Print "B =", B, "I=", I, "L=", L

Debug.Print "Sng =", Sng, "D =", D; "C=", C

Debug.Print "SF =", SF, "SV =", SV, "Dat=", Dat

If O Is Nothing Then Debug.Print "Объект не определен"

If V = Empty Then Debug.Print "Variant переменные не инициализированы"

End Sub

Пример 3.1. (html, txt)

Запустив процедуру Start модуля Father, мы получили такие результаты отладочной печати:

Father1: Fx= 12 Fy = 18 Fz = 1

Mother: Статическая переменная Count = 1

Father1: Fx= 14 Fy = 16 Fz = 1

Mother: Статическая переменная Count = 2

Father1: Fx= 16 Fy = 14 Fz = 1

Mother: Статическая переменная Count = 3

Finish: Fx =16 Fy = Fz = 2

Mx = 14 My = 0 Mz =

B = 0 I= 0 L= 0

Sng = 0 D = 0 C= 0

SF = SV = Dat= 0:00:00

Объект не определен

Variant переменные не инициализированы

Дадим краткий комментарий:

  • Процедуры Father и Mother трижды взаимно вызывают друг друга. Статическая переменная Count подсчитывает число сделанных обращений.

  • Процедура Father печатает значения глобальных переменных Fx, Fy и локальной переменной Fz. Заметьте, локальное объявление "сильнее" глобального.

  • Процедура Finish печатает заключительные значения переменных Fx, Fy, Fz, Mx, My и Mz. Здесь печатается значение глобальной переменной Fz, а значения двух переменных - Fy и Mz - не определены. Дело в том, что Fy - закрытая переменная модуля Father, а Mz вообще не объявлялась. И все же ошибки не возникает, так как действуют объявления по умолчанию и обе эти переменные считаются объявленными в модуле Mother и по умолчанию имеют тип Variant. Именно здесь кроется причина возможных ошибок, во избежание которых мы и советовали включить оператор Option Excplicit. Будь это сделано, - появились бы предупреждающие сообщения. У нас эти опции написаны, но специально закомментированы для демонстрации эффекта их отсутствия. Если их включить, то ошибка сразу встретится в процедуре Start -- ведь переменные My и Mz не определены в модуле Father.

  • Вторая часть процедуры Finish носит самостоятельный характер, - она демонстрирует объявления всех простых типов и печать значений, получаемых переменными при объявлении. Заметьте, как проверяется неопределенность объекта и пустота значений переменных.