Понятие процедур, функций, операторов, переменных
Процедура – это подпрограмма какого-либо модуля. Она начинается ключевым словом — оператором Sub и заканчивается оператором End.
Процедуры производят обработку каких-либо событий (event procedure) и могут вызываться как самим VB, так и другими процедурами.
В частности, макрос VBA – это тоже процедура типа Sub. Это единственный класс процедур типа Sub, способных выполняться непосредственно путем вызова по имени либо из приложения (Word, Excel), либо из редактора VBA.
Процедуры состоят из операторов – наименьших жизнеспособных единиц программного кода, которые занимают, как правило, одну строку кода.
Операторы осуществляют действия над процедурами, переменными и константами.
Кроме процедур в состав модулей могут входить также и функции.
Функция отличается от процедуры тем, что она, выполняя различные действия над переменными и константами, возвращает результат вычислений в программу. Таким образом, результатом ее выполнения является появление некоторого значения. Переменные и константы в функции соединяются знаками операций.
Объявление функции осуществляется оператором Function, а окончание – также оператором End.
Переменные
Переменная (variable) – это имя (ярлык), для некоторого, хранящегося в программе, фрагмента информации, которую можно изменять, или, другими словами, — это имя, которое программист дает области памяти, используемой для хранения данных какого-либо типа.
Строго говоря, переменная (как контейнер для информации) и хранящаяся в ней информация – это не одно и то же, и надо бы говорить: «информация, представляемая переменной», т. к. следует иметь в виду, что переменная может стать командой. Переменные VB могут хранить любые типы данных.
Переменная подобна именованной ячейке рабочего листа Excel. Чтобы сослаться на содержимое, нужно вместо адреса ячейки обозначить имя переменной.
Переменные в операторах VB используются так же, как в уравнениях алгебры.
Принципы и правила выбора имен для переменных
При выборе имени переменной (для безошибочной идентификации) должны соблюдать следующие правила:
- имя переменной должно начинаться с буквы алфавита, после которой имя переменной может состоять из любой комбинации цифр, букв или символов подчеркивания;
- имена переменных не должны содержать пробелы, точку или любой другой символ, который VBA использует для обозначения математических операций и операций сравнения (например, =, +, -, * и т. п.);
- имена переменных не должны превышать 255 символов;
- имя переменной не должно дублировать определенные ключевыеслова VB, называемые ограниченными ключевыми словами (restricted keywords). Если вы наберете такое слово, то отображается синтаксическая ошибка;
- имя переменной должно быть уникальным в рамках области его действия (называемой scope – скауп или предел), т. е., в пределах процедуры или модуля, где эта переменная объявляется.
11. Процедуры и функции
Часто одну и ту же последовательность инструкций требуется повторить в нескольких местах программы. Чтобы не тратить время на копирование инструкций в большинстве языков программирования предусмотрены средства для организации подпрограмм . Подпрограмма – последовательность инструкций, которой можно дать произвольное имя и использовать его в качестве сокращенной записи. Такую именованную последовательность инструкций будем называть также процедурой . Определение сокращенной записи называется описанием процедуры, а вызов ее из программы вызовом процедуры или оператором процедуры.
Пример : Создадим программу с процедурой, печатающей на экране слово Hello .
На этом примере мы видим следующее:
1) Описание процедуры располагается в разделе описаний программы (там же где описываются переменные, типы, константы и т.п.). Традиционно описания процедур ставятся в конец раздела (после того как описаны все переменные), но это не обязательно.
2) Простейшая процедура состоит из заголовка и тела процедуры. Заголовок состоит из слова procedure и имени процедуры. Имена процедур (как и имена
переменных, типов и констант) могут быть любым сочетанием латинских букв, цифр и символа подчеркивания, начинающимся не с цифры.
3) Тело процедуры ограничено словами begin и end . После end ’а ставится точка с запятой. В теле процедуры пишутся все инструкции, которые будут выполняться при ее вызове.
4) Вызов процедуры производится в разделе операторов программы. Для вызова достаточно написать имя процедуры. В приведенном примере вызов производится два раза. Соответственно дважды будет напечатано слово Hello .
11.2. Локальные переменные
Каждая процедура может иметь собственный раздел описания переменных (а также типов, констант и т.п.). Переменные, описанные в этом разделе, называются локальными и действуют только внутри процедуры.
Часто некоторые переменные используются только внутри некоторой последовательности инструкций и не имеют смысла за пределами этих инструкций. В программе существенно проще разобраться, если такие инструкции будут оформлены как процедура, а такие переменные будут описаны как локальные.
Пример : Программа с процедурой, печатающей слово Hello 10 раз.
for i:=1 to 10 do write(‘Hello_’);
Программа выведет 5 строк по 10 слов Hello .
Как видим, раздел описаний процедуры располагается сразу после заголовка и перед телом процедуры. В разных процедурах можно использовать локальные переменные с одинаковыми именами. Не смотря на одинаковость имен, это будут разные переменные, их значения будут храниться в разных областях памяти, а присваивания одним никак не повлияют на значения других. После завершения работы процедуры память, выделенная под локальные переменные, освобождается, все их значения пропадают.
Переменные, описанные в разделе описаний основной программы, будем называть глобальными . Глобальные переменные действуют как в теле программы, так и во всех процедурах. Если имя локальной и глобальной переменной, как в приведенном примере, совпадают, то это все равно разные переменные. Внутри процедуры при обращении к переменой i подразумевается, что это локальная переменная.
Представьте себе, что в рассмотренном примере локальная переменная i не описана. Синтаксической ошибки не возникнет, так как есть глобальная
переменная, которая и будет использована как счетчик цикла внутри процедуры. Однако смысл программы измениться. Процедура изменит значение глобальной переменной i, которая используется как счетчик в другом цикле уже в основной программе. Последствия непредсказуемы. Скорее всего, программа выведет только одну строку со словами Hello . Но может и зациклится, выводя Hello до бесконечности.
Пример : Глобальная и локальная переменные.
Не смотря на то, что при вызове процедуры P2 выполнится инструкция x:=10; глобальная переменная x останется равной 5.
11.3. Параметры процедур
Очень часто некоторые последовательности инструкций, встречающиеся в программе, не идентичны, но очень близки по форме. Особенно важна ситуация, когда различие между различными вхождениями инструкций можно устранить систематической заменой идентификаторов или выражений.
Пример: В описанном в пункте 10.5 алгоритме сортировки методом выбора, требовалось искать минимальный элемент в несортированной части массива и ставить его на левый край несортированной части. Отличие в действиях на каждом шаге алгоритма сводилось к изменению одного параметра – номера индекса, с которого начиналась несортированная часть.
Такие инструкции можно записать в виде процедуры, работа которой зависит от одного или нескольких параметров. Параметры описываются в скобках после имени процедуры.
Пример : Программа, печатающая произведение двух чисел с помощью процедуры.
Программа запросит у пользователя значения переменных x и y, затем вызовет процедуру Mult, указав при этом, что значения параметров a и b при данном вызове процедуры должны быть равны значениям переменных x и y. Процедура выведет произведение x*y.
Переменные a и b в заголовке процедуры называются формальными параметрами. То, что подставляется при вызове процедуры (в примере это переменные x и y), называется фактическими параметрами.
Формальный параметр внутри процедуры может использоваться как обычная локальная переменная. То есть их можно использовать в выражениях и даже присваивать им новые значения. Отличие от просто локальных переменных в том, что при вызове процедуры обязательно указывается, чему они изначально равны.
В качестве фактических параметров в данном примере могут выступать произвольные выражения. Например, возможен такой вызов процедуры: Mult(x/y+1, 2). Значения этих выражений присвоятся формальным параметрам, и процедура напечатает значение выражения (x/y+1)*2.
11.4. Параметры-значения и параметры-переменные
Существует два способа описывать параметры: как параметры-значения и как параметры-переменные . В предыдущем разделе использовались параметрызначения. Параметр-значение является просто локальной переменной, начальное значение которой задается при вызове процедуры.
повлияют на значения глобальных переменных a и b> begin
Если в заголовке процедуры перед какими-либо из параметров поставить слово var , то это будут параметры-переменные. Например:
procedure P3( var a, b: integer; c: real);
Здесь a и b – параметры-переменные, c – параметр-значение. При вызове процедуры фактический параметр, задающий значения этих формальных параметров не может быть выражением или константой, а должен быть обязательно переменной. То есть, недопустимы следующие вызовы:
где x, y, z – глобальные переменные. Такие инструкции вызовут синтаксическую ошибку. В то же время синтаксически правильными будут вызовы:
При использовании параметров-значений во время вызова процедуры происходит присваивание значения формальному параметру, то есть значение записывается в выделенные под хранение параметра ячейки памяти. При использовании параметров-переменных память под них не выделяется. Вместо этого на время работы процедуры они становятся синонимами тех переменных, которые указываются в качестве фактических параметров. Так при вызове P3(x, y, 2) формальные параметры a и b будут работать с теми же ячейками памяти, что и переменные x, y. Соответственно, если формальному параметру в процедуре присваивается новое значение, то и значение фактического параметра изменится. Воспроизведем пример, заменив тип параметров (добавим var перед их описанием):