
- •Методические указания
- •Среде Microsoft excel
- •Лабораторная работа №1. Введение в Visual Basic for Applicрations. Структура программы. Типы данных.
- •Р ис. 1.1 Редактор vba
- •Практическое упражнение.
- •Контрольные вопросы.
- •Лабораторная работа №2. Инструкции управления порядком выполнения команд.
- •Инструкция If…Then…Else
- •Инструкция Select Case
- •Безусловный переход с помощью инструкции GoTo
- •Практическое упражнение.
- •Безусловный выход из цикла.
- •Цикл While…Wend
- •Цикл For…Next
- •Практическое упражнение.
- •Контрольные вопросы.
- •Лабораторная работа №4. Массивы. Задание собственных типов данных.
- •Многомерные массивы
- •Задание собственных типов данных
- •Область определения и время жизни переменных
- •Практическое упражнение.
- •Использование окна свойств объекта.
- •Создание форм.
- •Размещение элементов управления в форме
- •Практическое упражнение.
- •Контрольные вопросы.
- •Лабораторная работа №6. Модель объектов Excel.
- •Использование объекта Application.
- •Использование семейства Workbooks.
- •Использование семейства Worksheets.
- •Использование объекта Range.
- •Практическое упражнение.
- •Контрольные вопросы.
Область определения и время жизни переменных
Область определения и время жизни переменных - два важных понятия, которые используются при работе с переменными. Они определяют, как и где применяются переменные.
Область определения переменной определяет, где можно использовать переменную. В VBA имеется три уровня области определения:
Переменные уровня процедуры (личные переменные) используются только в процедуре, в которой они описаны.
Переменные уровня модуля используются только в процедурах модуля, в котором они описаны, но не в других модулях проекта.
Общие переменные используются во всех процедурах любого модуля данного проекта.
Область определения переменной определяется тем, где и как описать переменную:
Личная переменная описывается с помощью инструкции Dim, размещенной в процедуре.
Переменная уровня модуля описывается с помощью инструкции Dim, размещенной в разделе описаний модуля.
Общая переменная описывается с помощью инструкции Public, а не инструкции Dim, в разделе описаний модуля:
Public UserName As String
Личная переменная сохраняет свое значение только при выполнении процедуры, в которой она определена. При выходе из этой процедуры значение теряется, а при повторном запуске необходимо снова инициализировать переменную.
Иногда удобнее использовать переменную, которая не теряет свое значения при выходе из процедуры, в которой она описывается. Для этого используется инструкция Static, которая имеет тот же синтаксис, что и инструкция Dim.
Static Counter As Integer
В этом случае переменная Counter сохраняет свое значение, пока выполняются другие процедуры.
Проиллюстрируем сказанное на примерах процедур. Введите нижеприведенный код в окне модуля и запустите на выполнение процедуру CallingMacro.
Dim Counter As Integer
Sub CallingMacro()
CounterMacro
BadCounterMacro
Debug.Print "Counter = " & Counter
End Sub
Sub CounterMacro()
Static MyCounter As Integer
Counter = Counter + 1
MyCounter = MyCounter + 1
Debug.Print "CounterMacro: Counter = " & Counter
Debug.Print "CounterMacro: MyCounter = " & MyCounter
End Sub
Sub BadCounterMacro()
Dim MyCounter As Integer
Counter = Counter + 1
MyCounter = MyCounter + 1
Debug.Print "BadCounterMacro: Counter = " & Counter
Debug.Print "BadCounterMacro: MyCounter = " & MyCounter
End Sub
В приведенных процедурах имеются три переменных:
переменная Counter - переменная уровня модуля, поэтому она доступна во всех процедурах модуля. При каждом вызове процедуры CounterMacro или BadCounterMacro переменная Counter увеличивается на единицу.
переменная MyCounter описана с помощью инструкции Static в процедуре CounterMacro, поэтому она используется только в этой процедуре и не доступна в других. Переменная сохраняет свое значение при выходе из процедуры и каждый раз увеличивается на единицу при входе в нее. Прежде чем вызвать процедуру в первый раз, переменная MyCounter инициализируется значением 0.
другая переменная с именем MyCounter описана как личная переменная процедуры BadCounterMacro, без использования инструкции Static. Поэтому она повторно инициализируется значением 0 при каждом вызове процедуры.
Теперь посмотрим на результаты выполнения макроса CallingMacro в окне отладки (Вид/Окно отладки), если запустить его дважды:
CounterMacro: Counter = 1
CounterMacro: MyCounter = 1
BadCounterMacro: Counter = 2
BadCounterMacro: MyCounter = 1
Counter = 2
CounterMacro: Counter = 3
CounterMacro: MyCounter = 2
BadCounterMacro: Counter = 4
BadCounterMacro: MyCounter = 1
Counter = 4
Очевидно, что переменная уровня модуля Counter увеличивается на единицу при вызове каждой из процедур. Переменная MyCounter процедуры CounterMacro также непрерывно увеличивается на единицу при входе в процедуру, а переменная MyCounter процедуры BadCounterMacro каждый раз инициализируется значением 0 и увеличивается только до 1.