какой функционал присутствующий сегодня в компютерах на уровне ассемблера представлял фортран во время его введения в использова |
Основы программирования
16.1. Процедуры, подпрограммы и функции
Процедуры записываются в стандартных модулях и на процедурных листах, связанных с объектами проекта. Команда Insert-Procedure вызывает диалог для добавления процедуры в текущий модуль (рис.16.1). Выполнение этого диалога приводит к появлению в тексте модуля двух строк Public Sub MyProc() и End Sub.
После записи оператора начала процедуры Sub вручную и нажатия клавиши Enter конец процедуры записывается автоматически. Для переименования процедуры достаточно изменить ее идентификатор в операторе объявления процедуры Sub.
В редакторе VB можно записать любой оператор языка. Удобно воспользоваться справочной системой и скопировать в процедуру примеры, иллюстрирующие выбранную справку. Как и любой язык программирования, VBA имеет свои ключевые слова и синтаксис, нарушение правил которого вызывает ошибки.
Операторы и комментарии записываются в процедурах. Операторы представляют собой команды обработки объектов приложения и команды языка Visual Basic, а комментарии – некоторый свободный текст, который вводится в программу в качестве пояснений. Текст комментария начинается с одинарной кавычки (‘)1Следует отличать одинарную кавычку (‘)от апострофа (').. Применение комментариев значительно облегчает чтение и модификацию программы, в том числе и самому автору программы через некоторое время.
Операторы записываются на отдельных строках программы. Для разделения операторов, записанных на одной строке, используется знак двоеточия (:). Допускается перенос длинного оператора на следующую строку при помощи символа продолжения строки (_). Для облегчения записи операторов можно использовать разные приемы:
- команда Complete Word из меню Edit или клавиши Ctrl+пробел ускоряют набор ключевых слов;
- нажатие клавиши Точка (.) после имени объекта высвечивает список свойств и методов, из которого можно выбрать нужное;
- нажатие на клавишу Открывающая скобка после имени процедуры или функции высвечивает подсказку по формальным параметрам процедур и функций.
Можно импортировать (команда Import File из меню File) текст модуля из файлов с расширениями .frm (формы), .bas (модули), .cls (классы). Также можно экспортировать (команда Export File из меню File) текст модуля в файлы с расширениями .frm, .bas, .cls. Возможности экспорта и импорта позволяют легко переносить приложение на VBA из одного документа в другой.
Все исполняемые операторы программы размещаются в процедурах. Вне процедур в начале модуля могут находиться только опции (например, Option Explicit), объявления модульных, глобальных переменных и переменных пользовательского типа.
Процедуры представляют собой логические сегменты программы, которые реализуют часть общего алгоритма решения задачи. Процедуры могут вызываться другими процедурами.
При использовании процедур отпадает необходимость дублировать участки программы, заменив их многократным вызовом процедуры, которая выполняет необходимые действия. Можно использовать разработанную процедуру в нескольких проектах. Программы, разбитые на процедуры, легче читаются и легче модифицируются. Легко можно локализовать часть программы, в которой произошла ошибка.
Классификация процедур
Существуют следующие типы процедур:
- основная процедура, которая вызывает другие процедуры. Это самостоятельно используемая процедура;
- вызываемые процедуры, реализующие конкретные задачи проекта;
- процедуры обработки событий.
В качестве вызываемых процедур применяются процедуры общего типа (подпрограммы) и процедуры-функции. Функции возвращают некоторое значение в отличие от подпрограмм, которые значений не возвращают. Под понятием "функция возвращает значение" подразумевается, что в процессе выполнения функции присваивается значение, которое доступно вызвавшей ее процедуре.
Процедуры обработки событий (событийные процедуры) связаны с конкретными событиями объектов. Если установлена связь процедуры с событием объекта приложения, то процедура является событийной. Особенность событийных процедур в том, что они запускаются автоматически, если происходит некоторое событие.
Удобно написать автоматически запускаемые процедуры со специальными именами, например, Auto_Open – процедура, выполняемая при открытии документа.
Структура и объявление процедуры
Каждая процедура начинается с оператора объявления процедуры (функции) Sub (Function) и заканчивается оператором завершения процедуры (функции) End Sub (End Function). Все операторы, заключенные между этими парными операторами, составляют тело процедуры (функции).
Процедуры определяются только на модульном уровне. Внутри процедуры не может располагаться объявление другой процедуры.
Выход из процедуры обычно происходит естественным образом – при достижении оператора окончания процедуры (функции). Один или несколько операторов немедленного выхода Exit Sub (Exit Function) могут содержаться внутри процедуры (функции). При любом способе выхода из процедуры управление передается оператору, следующему за командой вызова процедуры.
Синтаксис объявления процедуры общего типа
Оператор объявления процедуры присваивает ей имя и перечисляет формальные параметры процедуры. Синтаксис:
[Private|Public][Static] Sub name ([arglist])
- Private или Public (указывается одно из двух) определяют область видимости процедуры;
- Static указывает, что все локальные переменные процедуры сохраняют свои значения между вызовами процедуры;
- name – имя процедуры, удовлетворяющее стандартам на имена в языке VB. Имя процедуры должно быть уникальным в пределах модуля;
- arglist – список формальных параметров, который может отсутствовать. В списке перечисляются переменные или значения, которые являются параметрами, передаваемыми процедуре при вызове. Элементы списка разделяются запятыми. При отсутствии параметров после имени процедуры следуют открывающая и закрывающая скобки.
Ключевое слово Private определяет закрытую процедуру, т. е. процедуру, доступную только в том модуле, в котором она объявлена. Ключевое слово Public объявляет процедуру открытой, т. е. доступной во всех модулях текущего проекта и во всех модулях любого проекта, связанного с данным. Это означает, что процедура может быть вызвана из любой процедуры любого модуля.
Если Private и Public опущены, то процедура считается открытой – Public. Если в модуле присутствует инструкция Option Private, то процедуры этого модуля не доступны вне проекта.
Синтаксис объявления функции
Оператор объявления функции присваивает ей имя, перечисляет ее параметры и устанавливает тип возвращаемого значения. Синтаксис:
[Private|Public][Static] Function name ([arglist]) [As Type]
Объявление функции отличается от объявления процедуры использованием ключевого слова Function вместо Sub и возможным указанием типа Type возвращаемого функцией значения. Если тип возвращаемого значения не указан, то VBA трактует его как Variant. Определение типа передаваемого значения позволяет повысить эффективность программы.
Вызов процедур
Для вызова процедуры можно, находясь в окне документа, нажать кнопку Макросы (рис. 15.10 , рис.16.1) или, находясь в окне VB, выполнить команду Tools-Macros. В новом диалоге (рис.16.2) задается или выбирается имя выполняемого макроса из списка имеющихся макросов. Нажатие на командную кнопку Выполнить этого диалога активизирует выбранную процедуру.
Нажатие стрелки ниже кнопки Макросы, расположенной на вкладке Вид (рис.16.3) высвечивает дополнительные команды, первая из которых также открывает диалог со списком доступных макросов.
Диалог Макросы высвечивается при нажатии кнопки Run Macro на панели инструментов Visual Basic или Debug (рис. 15.7 или рис. 15.8), если точка вставки не установлена внутри какой-либо процедуры.
Любую процедуру, расположенную в стандартном модуле, можно запускать из диалогового окна Макрос. Процедуры, которые расположены на процедурных листах, связанных с объектами рабочей книги или с пользовательскими формами, недоступны в этом окне.
Для быстрого запуска процедуры можно применять "горячие" клавиши (Shortcut), заданные при записи макроса (рис. 15.9 ) или в параметрах процедуры, которые изменяются после нажатия на кнопку Параметры в диалоге на рис.16.2. Это нецифровая клавиша, нажатие на которую в сочетании с клавишей Ctrl запустит макрос. Дополнительно можно использовать клавишу Shift. Не рекомендуется использование комбинаций клавиш, задействованных для других целей, так как новое назначение будет приоритетным и отменит существовавшее ранее.
При задании "горячих" клавиш в макросе автоматически появляется комментарий – сообщение о наличии таких клавиш (например, сообщение вида "сочетание клавиш: Ctrl+t").
Удобно связать макрос или любую процедуру VBA с объектами рабочей книги или рабочего листа. Для запуска макроса можно:
- создать кнопку на панели быстрого доступа;
- создать кнопку на рабочем листе;
- связать процедуру с графическим объектом.
Первая возможность реализуется при помощи настройки панели быстрого доступа . Можно нажать последнюю пиктограмму этой панели или выбрать категорию Настройка в параметрах MS Excel.
Далее необходимо выбрать из списка команд (список слева) необходимую команду и нажать кнопку Добавить. Команда появится в списке справа, который соответствует кнопкам на панели быстрого доступа. Выбор строки Разделитель разместит на панели вертикальную линию. Добавление строки Макросы поместит одноименную кнопку на панель быстрого доступа. Для размещения кнопки, соответствующей определенному макросу, необходимо раскрыть список Часто используемые команды и выбрать Макросы. Тогда в левом списке появится перечень доступных процедур. Нужно выбрать процедуру и перенести ее в список справа. Для добавления строк в правый список можно использовать двойной щелчок на названии команды или процедуры.
Привязка к графическому объекту выполняется командой Назначить макрос из контекстного меню для объекта. При выборе этой команды открывается диалог с перечнем макросов, аналогичный диалогу на рис.16.2. Можно выбрать макрос и нажать кнопку OK. Дополнительно в этом диалоге можно создать новую процедуру в редакторе VB (кнопка Создать) или записать новый макрос в режиме макрорекордера (кнопка Записать).
Привязка процедуры к кнопке рабочего листа подразумевает выполнение событийной процедуры нажатия на кнопку.