Основы программирования
Область видимости переменных
Все переменные обладают областью видимости и временем жизни. Область видимости переменной – это процедуры, в которых переменная может быть использована, т. е. процедуры, в которых доступно значение переменной. Переменные, объявленные на уровне процедуры, доступны только внутри этой процедуры и носят название локальных переменных (Local). Область видимости таких переменных – конкретная процедура.
Локальные переменные с одинаковыми идентификаторами, определенные в разных процедурах, являются разными переменными, и использование подобной переменной в разных процедурах в предположении, что это одна и та же переменная, приводит к ошибке выполнения программы.
Модульные и глобальные переменные должны быть описаны явно в области Declarations.
Уровень объявления | Оператор объявления | Переменная | Область видимости |
---|---|---|---|
Процедура | Dim, Private | Локальная | Процедура |
Уровень модуля | Dim, Private | Модульная | Все процедуры модуля |
Уровень модуля в стандартном модуле (Module) | Public | Глобальная | Все процедуры проекта |
Уровень модуля – обработчика событий | Public | Модульная | Все процедуры процедурного листа, в котором переменная объявлена |
Можно использовать одинаковые идентификаторы для объявления локальных, модульных и глобальных переменных. Если имена переменных конфликтуют, иными словами, в процедуре определена локальная переменная, идентификатор которой совпадает с идентификатором модульной или глобальной переменной, то внутри процедуры используется локальная переменная.
Время жизни переменных
Время жизни – это тот период, в течение которого значение переменной сохраняется. Локальные переменные инициализируются при входе в процедуру или при первом присвоении, если переменная не объявлена. При выходе из процедуры память, отведенная локальной переменной, освобождается, и переменная теряет свое значение – Visual Basic "забывает" значения локальных переменных. Время жизни локальной переменной – процедура. Модульные переменные сохраняют значения в течение времени выполнения программы, записанной в том стандартном модуле или на том процедурном листе, на котором они объявлены. Глобальные переменные сохраняют свои значения в течение всего времени выполнения программы проекта.
Объявление Static позволяет сохранить значение локальной переменной при выходе из процедуры, в которой она так объявлена, т. е. продлить время ее жизни. При выходе из этой процедуры память, отведенная такой переменной, сохраняется, но становится временно недоступной. При повторном входе в данную процедуру статическая переменная имеет то же значение, которое было у нее перед выходом из этой процедуры. Время жизни статической переменной – модуль, в котором определена процедура, объявившая эту переменную.
Объявление Static может быть указано только для локальных переменных. Если ключевое слово Static использовано при объявлении процедуры или включена опция All Local variables as Static (рис.16.1), то при вставке новой процедуры командой Insert Procedure все локальные переменные процедуры будут статическими.
Инициализация переменных
При входе в процедуру локальные переменные (за исключением переменных, объявленных как Static) автоматически получают начальные значения в соответствии с типом переменной (см. таблицу 16.4). Переменные, объявленные на уровне модуля, инициализируются при первом входе в модуль, статические переменные – при первом входе в процедуру, в которой они объявлены. На практике для того, чтобы избежать неясностей, рекомендуется явным образом инициализировать переменную (присваивать ей начальное значение), прежде чем использовать ее в выражении.
Тип | Начальное значение |
---|---|
Integer, Long, Single, Double | 0 |
String (переменная длина) | Пустая строка (кол-во символов равно нулю) |
String (фиксированная длина) | Заполняется символами, имеющими нулевой ASCII-код, иными словами Chr(0) |
Variant | Empty |
Object | Nothing |
16.3. Операторы управления
Как было сказано ранее, любая процедура – это последовательность операторов. Стандартный порядок выполнения операторов – последовательный, сверху-вниз или слева-направо, если несколько операторов записаны в одной строке и разделены двоеточием. Управляющие операторы, определяя альтернативный порядок выполнения команд (ветвление) или повторение некоторой совокупности команд (циклы), позволяют изменить этот порядок.
Управляющие операторы ограничивают операторными скобками совокупность команд, выполняемых в цикле или при ветвлении.
Условный оператор If
Оператор организует ветвление программы, т. е. выполнение различных действий в зависимости от истинности условия. Это может быть условие, налагаемое на значения переменных, или условие относительно текущего состояния приложения. Например, если необходим ввод данных в ячейки таблицы Excel и окно приложения "спрятано", то его необходимо отобразить.
Условный оператор может быть записан в одну строку или блоком. Возможно использование вложенных условных операторов.
Синтаксис оператора при записи в строку:
If condition Then [statements] [Else elsestatements]
Например, оператор IF salary <9000 Then social=salary*0.2 вычисляет выплату, если зарплата менее 9000.
Синтаксис оператора при записи блоком (пример см. рис.16.7):
If condition-1 Then [statements] [ElseIf condition-2 Then [elseifstatements-2] .. [Else [elsestatements]] End If
- сondition-n – тестируемые выражения со значением True или False. Обязательный элемент;
- statements, elseifstatements-2, elsestatements – последовательности операторов, необязательные элементы;
- ElseIf – ключевое слово (записывается в одно слово), используемое для задания дополнительных условий (их может быть несколько). Необязательный элемент;
- End If – оператор, играющий роль закрывающей операторной скобки.
Если условие (condition) верно, то выполняется последовательность операторов statements. Если условие нарушено, при записи оператора в строку выполняется последовательность операторов elsestatements, а при записи оператора блоком конструкция ElseIf позволяет задать дополнительные условия тестирования и, если ни одно из них не выполнено, то выполняются операторы elsestatements. Комбинируя несколько операторов сравнения, можно создать достаточно сложное логическое выражение.
После выполнения одной последовательности операторов управление передается оператору, следующему за условным оператором, а в случае блочной структуры – за End If. Оператор End If обязателен при записи условного оператора блоком и не используется при записи условного оператора в строку.
Приведенный на рис.16.7 оператор вычисляет выплату, если зарплата менее 9000, и устанавливает нулевую выплату в противном случае.
Оператор выбора Select Case
При необходимости анализировать большое количество условий в качестве альтернативы условному оператору If используется оператор Select Case. Оператор Select Case – это оператор выбора ветви в зависимости от значения тестируемого выражения.
Синтаксис оператора:
Select Case testexpression Case expressionlist-n statements-n ... Case Else Elsestatements End Select
- testexpression – тестируемое выражение. Обязательный элемент;
- строки Case задают возможные значения тестируемого выражения;
- expressionlist – список значений тестируемого выражения, который определяет выполняемую последовательность операторов: если значение тестируемого выражения найдено в списке expressionlist-1, то выполняются операторы statements-1 и т. д.;
- строка Case Else определяет операторы, которые выполняются, если значение не найдено ни в одном списке;
- statements-n, elsestatements – последовательности операторов. Хотя бы одна из совокупностей операторов должна быть непустой.
Значения списка могут быть представлены константами или выражениями c числовыми или символьными значениями. Элементы списка перечисляются через запятую или могут иметь одну из двух форм:
- expression To expression задает диапазон значений списка: "от" и "до";
- Is comparisonoperator задает условие на значение тестируемого выражения, при справедливости которого выполняются последующие операторы.
Тестируемое выражение может быть задано формулой. По крайней мере, один список значений тестируемого выражения должен присутствовать в операторе.
После выполнения выбранной последовательности операторов соответствие тестируемого выражения другим спискам значений не проверяется, и управление передается оператору, следующему за End Select.
На рис.16.8 условный оператор, приведенный на рис.16.7, записан при помощи оператора Select Case.