Введение
В этой статье описывается, как использовать переменные в подпроцедурах Microsoft Excel в Microsoft Visual Basic для приложений.
Дополнительные сведения
Переменные в подпроцедуре
Мощной особенностью языков программирования является возможность хранить что-то в переменной, так что содержимое переменной может быть использовано или изменено позже в процедуре. В этом документе рассматриваются следующие варианты использования переменных в Visual Basic:
- Как объявляются переменные.
- Процедуры и проекты, которые могут использовать переменную.
- Время жизни переменной.
Объявление переменной в макросе
Самый простой способ объявить переменную в макросе — использовать инструкцию Dim. В следующей строке две переменные объявлены как целые числа:
Dim x As Integer, y As Integer
Указав x и y как целые числа, Visual Basic указывает, что нужно выделить достаточно памяти для целочисленной переменной (по 2 байта для x и y) и что информация, хранящаяся в x или y, представляет собой целое число от -32768 до 32767.
ПРИМЕЧАНИЕ. Если с помощью одной инструкции Dim объявлено несколько переменных, для каждой переменной необходимо указать тип данных для каждой из них.
Если не указать тип данных для каждой переменной, как в следующем коде Visual Basic, в качестве целочисленной переменной будет установлена только переменная y. Переменная x будет типом варианта:
Dim x, y As Integer
Дополнительные сведения см. в разделе "Тип данных Variant " ниже.
Чтобы выполнить проверку переменных, выполните следующие действия.
Сохраните и закройте все открытые книги, а затем откройте новую книгу.
Запустите редактор Visual Basic (нажмите клавиши ALT+F11).
В меню Вставка выберите Модуль.
Введите следующий код:
Sub Variable_Test()
Dim x Как целое число, y Как целое число
x = 10
y = 100
MsgBox "значение x равно " & x & _
Chr(13) & "значение y равно " & y
End SubЗапустите макрос Variable_Test . Появится следующее сообщение:
the value of x is 10
the value of y is 100Нажмите кнопку ОК.
В макросе Variable_Test измените следующую строку:
x = 10изменить вот так:
x = "error"Запустите макрос Variable_Test .
Вы получите ошибку во время выполнения, так как "error" не является целым числом, и пытаетесь присвоить это строковое значение целочисленной переменной x.
Сводка по типам данных
Ниже перечислены распространенные типы данных переменных.
тип данных Variant
Если тип данных не указан при объявлении переменной или переменная не объявлена вовсе, Visual Basic автоматически определяет тип данных Variant для этой переменной. Ниже описаны преимущества переменных, объявленных как этот тип данных.
- Эти переменные могут содержать строки, дату, время, логические или числовые значения.
- Переменные могут автоматически преобразовывать содержащиеся в них значения.
Недостатком является то, что переменные variant требуют не менее 16 байт памяти. 16 байт памяти могут быть значительными в больших процедурах или в сложных модулях.
Чтобы увидеть, как это работает в макросе Variable_Test, выполните следующие действия.
Измените код в макросе Variable_Test на:
Sub Variable_Test()
Dim x, y
x = "string"
y = 1.23
MsgBox "the value of x is " & x & _
Chr(13) & "the value of y is " & y
End Sub
Запустите макрос Variable_Test .
Вы не получите сообщение об ошибке, так как переменным типа x и y можно назначить что угодно.
ПРИМЕЧАНИЕ. Вы также можете опустить следующую строку, и макрос все равно будет работать, так как переменные x и y будут рассматриваться как типы данных Variant:
Dim x, y
Область действия переменной
Когда вы объявляете переменную, она может быть видна или не видна другим макросам в том же модуле, в других модулях или в других проектах. Эта доступность переменной в модулях называется областей. Существует три типа областей: уровень процедуры, уровень закрытого модуля и уровень общедоступного модуля. Область зависит от того, как и где объявлены переменные.
Области на уровне процедуры
Переменная с областей на уровне процедуры не отображается вне процедуры, в которой она объявлена. Если задать значение переменной в областях процедур, содержимое этой переменной не будет отображаться другими макросами.
Чтобы убедиться, что переменная с областью действия на уровне процедуры не отображается за пределами процедуры, в которой она объявлена, выполните следующие действия.
Вставьте новый модуль в проект.
Введите оба следующих макроса в этом модуле:
Sub Macro1() Dim x As Integer x = 10 MsgBox "x, как видно Макросом1 есть " & x 'следующая строка выполняется Макрос2 Макро2 End Sub Sub Macro2() MsgBox "x, как видно Макросом2 есть " & x End SubЗапустите макрос1, и появится следующее сообщение:
x, as seen by Macro1 is 10Нажмите кнопку "ОК", и появится следующее сообщение:
x, as seen by Macro2 isНажмите кнопку ОК.
Макрос2 не отображает значение переменной x, поскольку переменная x является локальной для макроса1.
Закрытые и общедоступные области на уровне модулей
Можно определить переменные в разделе объявлений модуля (в верхней части модуля, над всеми подпроцедурами) и задать области действия переменной с помощью оператора Public, оператора Dim или оператора Private. Если вы разместите Public statement перед своей переменной, ваша переменная будет доступна для всех макросов во всех модулях проекта. Если перед переменной поместить оператор Dim или оператор Private, переменная будет доступна только макросам в модуле, в котором она объявляется.
Чтобы увидеть разницу между заявлением Public и заявлением Dim, выполните следующие действия.
Сохраните и закройте все открытые книги, а затем откройте новую книгу.
Запустите редактор Visual Basic.
Вставить модуль в проект.
-
Type the following code into this module: Public x As Integer Sub Macro_1a() x = 10 MsgBox x Macro_1b End Sub Sub Macro_1b() x = x * 2 MsgBox x Macro2 End Sub Вставьте еще один модуль в проект.
Введите следующий код в этом модуле:
Sub Macro2()
x = x * 3
MsgBox x
End SubЗапустите макрос Macro_1a в первом модуле.
Переменная x, объявленная как "Public x As Integer", все три макроса в проекте имеют доступ к значению x. В первом окне сообщения отображается значение 10. Во втором окне сообщения отображается значение 20 (поскольку x умножается на 2 в Macro_1b). В третьем окне сообщения отображается значение 60 (поскольку значение x в Macro_1b было изменено на 20, а затем оно было умножено на 3 в макросе 2).
Измените строку объявления в первом модуле на:
Public x As Integerизменить вот так:
Dim x As IntegerЗапустите макрос Macro_1a .
При объявлении переменной x как "Dim x As Integer" только макросы в первом модуле имеют доступ к значению x. Таким образом, в первом окне сообщений отображается значение 10, во втором — 20 (поскольку x умножается на 2 в Macro_1b), а в третьем окне сообщений отображается значение 0 (поскольку макрос2 не видит значение x, а неинициализированное значение нуля используется макросом 2).
Измените строку объявления в первом модуле на:
Dim x As Integerизменить вот так:
Private x As IntegerЗапустите макрос Macro_1a .
При использовании области оператора Private отображаются те же окна сообщений, что и при использовании оператора Dim. Переменная x имеет ту же область, закрытую для модуля, в котором она объявлена.
ПРИМЕЧАНИЕ. Если вы хотите, чтобы область действия переменной была ограничена модулем, в котором она объявлена, используйте Privatestatement вместо оператора Dim. Они оба достигают одного и того же эффекта, но области действия становятся яснее при чтении кода, если вы используете оператор Private.
Время жизни переменной
Время, в течение которого переменная сохраняет свое значение, называется временем ее жизни. Значение переменной может меняться в течение срока ее существования, но значение сохраняется. Кроме того, когда переменная теряет область, она больше не имеет значения.
Инициализация значения переменной
При запуске макроса все переменные инициализируются значением. Числовая переменная инициализируется нулем, строка переменной длины инициализируется строкой нулевой длины (""), а строка фиксированной длины заполняется кодом ASCII 0. Переменные Variant инициализируются как Empty. Переменная Empty представляется нулем в числовом контексте и пустой строкой ("") в строковом контексте.
Переменные уровня процедуры
Если у вас есть переменная, объявленная в макросе с помощью оператора Dim, она сохраняет свое значение до тех пор, пока макрос выполняется. Если этот макрос вызывает другие макросы, значение переменной сохраняется (но недоступно другим макросам) до тех пор, пока выполняются эти другие макросы.
Чтобы продемонстрировать, как работают переменные уровня процедуры, выполните следующие действия.
Вставьте новый модуль в проект.
Введите оба следующих макроса в этом модуле:
Sub Macro1()
'Установите X в качестве переменной уровня процедуры
Dim x As Integer
MsgBox "инициализированное значение x равно " & x
x = 10
MsgBox "x is " & x
'следующая строка — Макро2
Макрос2
MsgBox "x все еще " & x
End Sub
Sub Macro2()
MsgBox "x, как видно Макросом2, равно " & x
End SubЗапустить макрос1.
Появится следующее сообщение:
the initialized value of x is 0Нажмите кнопку "ОК", и появится следующее сообщение:
x is 10Нажмите кнопку "ОК", и появится следующее сообщение:
x, as seen by Macro2 isНажмите кнопку ОК.
Макрос2 не отображает значение переменной x, поскольку переменная x является локальной для макроса1. Появится следующее сообщение:
x is still 10Нажмите кнопку ОК.
Запустить макрос1.
Вы получаете те же сообщения, что и в шагах 3–6, потому что как только макрос1 на шаге 6 прекращает выполнение макроса, значение переменной x теряется. Поэтому при повторном запуске макроса1 на шаге 7 в первом сообщении значение x отображается равным нулю (инициализированное значение).
Статическое ключевое слово
Если переменная уровня процедуры объявлена с помощью ключевого слова Static, значение переменной сохраняется до тех пор, пока проект не будет сброшен. Поэтому при наличии статической переменной при следующем вызове процедуры статическая переменная инициализируется последним значением.
Чтобы увидеть, как работает статическое ключевое слово, выполните следующие действия.
1.
Change the code in Macro1 to:
Sub Macro1()
'set x as a procedure level variable
Static x As Integer
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
Запустить макрос1.
Отобразится сообщение:
the initialized value of x is 0Нажмите кнопку "ОК", и появится следующее сообщение:
x is 10Нажмите кнопку ОК.
Запустите макрос1 и появится следующее сообщение:
the initialized value of x is 10Нажмите кнопку "ОК", и появится следующее сообщение:
x is 20Нажмите кнопку ОК.
Значения, которые появляются в сообщениях во второй раз, отличаются, потому что переменная x объявлена как статическая переменная и сохраняет свое значение после первого запуска макроса1.
ПРИМЕЧАНИЕ. Если у вас есть переменная уровня модуля, время ее жизни такое же, как если бы это была статическая переменная уровня процедуры.
Чтобы проверить время жизни переменной уровня модуля, выполните следующие действия.
1.
Change the code in the module that contains Macro1 to the following:
Dim x As Integer 'create a module-level variable
Sub Macro1()
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
Запустите макрос1, и появится следующее сообщение:
the initialized value of x is 0Нажмите кнопку "ОК", чтобы получить следующее сообщение:
x is 10Нажмите кнопку "ОК",
Запустите макрос1, и появится следующее сообщение:
the initialized value of x is 10Нажмите кнопку ОК.
Появится следующее сообщение:
x is 20Нажмите кнопку ОК.
Значения, которые появляются в сообщениях во второй раз, отличаются, потому что переменная x объявлена как статическая переменная и сохраняет свое значение после первого запуска макроса1 .
Сброс проекта для сброса переменных
Если требуется сбросить значение статической переменной или переменной уровня модуля, нажмите кнопку Сброс на
Панель инструментов Standard или нажмите кнопку "Сброс" в меню "Выполнить".
Если вы сделаете это для проекта Macro1 , а затем повторно запустите Macro1, значение переменной x инициализируется обратно равным нулю, и вы получите первое сообщение:
the initialized value of x is 0