Опубликован: 01.04.2010 | Уровень: для всех | Доступ: платный | ВУЗ: Национальный исследовательский университет "Высшая Школа Экономики"
Лекция 7:

Процедуры, подпрограммы и функции

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Аннотация: Если программа имеет в своем составе блоки, которые предполагают автономную обработку данных, или же в программе неоднократно повторяются некоторые последовательности операторов, рекомендуется разбить программу на ряд процедур, каждая из которых возьмет на себя часть реализации общего алгоритма решения задачи. Проводится классификация процедур: основная процедура, которая вызывает другие процедуры, вызываемые процедуры, реализующие конкретные задачи проекта и процедуры обработки событий. В качестве вызываемых процедур рассматриваются процедуры общего типа и процедуры-функции. Особое внимание уделяется встроенным функциям.
Ключевые слова: программа, последовательность операторов, сегменты, explicit, пользовательский тип, задача проекта, значение, функция, командная кнопка, связь, операторы, тело процедуры, выход, формальный параметр, объявление функции, variant, очередь, фактический параметр, макрос, составное имя, рабочая книга, тип переменной, передача параметров, адрес переменной, идентификатор переменной, элементарный тип, значение выражения, RA, AC-3, dimmed, p-si, символьная строка, оператор условия, установка значений, создание пользователя, пользовательские функции, имя функции, рабочий лист, нижняя граница, меню, двойной щелчок, объект, лист, тип объекта, workbook, список событий, математическая функция, переменная функции, преобразование данных, average, строковая функция, VBA, ASC, код символа, chr, HEX, comparator, string length, lens, extra, MID, replaceability, CAR, trim, val, ABS, абсолютная величина числа, натуральный логарифмы, RND, rounding, man-month, символьное представление, hour, Timer

Программа для решения некоторой задачи может иметь сложную структуру и состоять из любого количества операторов.

Если программа имеет в своем составе блоки, которые предполагают автономную обработку данных, или же в программе неоднократно повторяются некоторые последовательности операторов, рекомендуется разбить программу на ряд процедур, каждая из которых возьмет на себя часть реализации общего алгоритма решения задачи. Процедуры представляют собой логические сегменты программы.

Преимущества

  • При использовании процедур отпадает необходимость дублировать участки программы.
  • Вызывая несколько раз процедуру, программа выполняет несколько раз одни и те же действия, записанные один раз.
  • Программы, разбитые на процедуры, легче читаются и легче модифицируются. Легко можно локализовать часть программы, в которой произошла ошибка.

Процедура может располагаться на любом процедурном листе, в любом модуле или открытом проекте и может вызываться из любой процедуры.

Процедура состоит из некоторого количества операторов, объединенных в группу для решения некоторой задачи, т.е. это последовательность операторов языка, к которым возможно обращение как к связанной группе операторов. Невозможно выполнить часть процедуры - можно выполнить процедуру только целиком.

Важно

  • Все исполняемые операторы модуля размещаются в процедурах.
  • Вне процедур в начале модуля могут находиться только опции (например, Option Explicit ), объявления модульных, глобальных переменных и переменных пользовательского типа.

Классификация процедур

Обычно в составе проекта присутствуют

  • основная процедура, которая вызывает другие процедуры. Это самостоятельно используемая процедура;
  • вызываемые процедуры, реализующие конкретные задачи проекта;
  • процедуры обработки событий.

В качестве вызываемых процедур применяются подпрограммы и функции: процедуры-функции возвращают некоторое значение в отличие от подпрограмм, которые значений не возвращают.

Замечание

  • Под понятием "функция возвращает значение" подразумевается, что в процессе выполнения процедуре-функции присваивается некоторое значение, которое доступно вызвавшей ее процедуре.

Чтобы отличать процедуры-функции от остальных процедур, для последних будем использовать термин "процедуры общего типа". Для краткости вместо термина "процедура-функция" будем использовать термин "функция".

Процедуры обработки событий (событийные процедуры) связаны с конкретными событиями. Событие, например, - это нажатие командной кнопки в диалоге, закрытие или активизация окна таблицы. Если установлена связь процедуры с событием объекта приложения, то процедура является событийной. Особенность событийных процедур в том, что они запускаются автоматически, если происходит некоторое событие.

Удобно

  • написать автоматически запускаемые процедуры со специальными именами, например: Auto_Open - автопоцедура, выполняемая при открытии документа.

Далее под термином "процедура" будем подразумевать любую процедуру - вызывающую, вызываемую, процедуру-функцию или событийную процедуру, если специально не оговорено иное.

Структура и объявление процедуры

Каждая процедура начинается с оператора объявления процедуры (функции) Sub (Function) и заканчивается оператором завершения процедуры (функции) End Sub (End Function). Все операторы, заключенные между этими двумя операторами, составляют тело процедуры (функции).

При вставке новой процедуры с использованием команды Insert-Procedure в окне кода автоматически появляются команды начала и окончания процедуры (функции) - достаточно в диалоге задать название новой процедуры и выбрать ее тип.

Выход из процедуры обычно происходит естественным образом - при достижении оператора окончания процедуры (функции). Один или несколько операторов немедленного выхода Exit Sub (Exit Function) могут содержаться внутри процедуры (функции).

Запомните

  • При любом способе выхода из процедуры управление передается оператору, следующему за командой вызова процедуры.
  • Процедуры определяются только на модульном уровне. Внутри процедуры не может располагаться объявление другой процедуры.

Синтаксис объявления процедуры общего типа

Оператор объявления процедуры присваивает ей имя и перечисляет формальные параметры процедуры. Синтаксис

[Private|Public][Static] Sub name ([arglist])
  • Private или Public (указывается одно из двух) определяют область видимости процедуры:
    • Private определяет, что процедура доступна только в том модуле, в котором она объявлена;
    • Public объявляет процедуру доступной во всех модулях текущего проекта и во всех модулях любого проекта, связанного с данным. Это означает, что процедура может быть вызвана из любой процедуры любого модуля.

Важно

  • Если в модуле присутствует инструкция Option Private, то процедуры, размещенные в этом модуле, не доступны вне проекта.
  • Если Private и Public опущены, то процедура считается общедоступной - Public.
  • Static указывает, что все локальные переменные процедуры сохраняют свои значения между вызовами процедуры.
  • name - имя процедуры, удовлетворяющее стандартам на имена в языке VB. Имя процедуры должно быть уникальным в пределах модуля.
  • arglist - список формальных параметров. В списке перечисляются переменные, которые обозначают параметры, передаваемые процедуре при вызове. Элементы списка разделяются символом запятая ( ,). Список параметров необязателен. При отсутствии параметров после имени процедуры следуют открывающая и закрывающая скобки.

Синтаксис объявления функции

Оператор объявления функции присваивает ей имя, перечисляет ее параметры и устанавливает тип возвращаемого значения. Синтаксис

[Private|Public][Static] Function name ([arglist]) [As Type]

Объявление функции отличается от объявления процедуры использованием ключевого слова Function вместо Sub и возможным наличием типа Type возвращаемого функцией значения, который является необязательным в объявлении функции.

Важно

  • Определение типа передаваемого значения позволяет повысить эффективность программы.
  • Если тип возвращаемого значения не указан, то VBA трактует его как Variant.

Вызов процедуры

Процедуры проекта могут быть связаны между собой сложным образом: одни процедуры могут вызывать другие процедуры, которые в свою очередь могут вызывать дополнительные процедуры. Некоторые процедуры могут автоматически выполняться, если случается некоторое событие и для них не требуются команды вызова, но они могут обращаться к процедурам общего типа или к процедурам-функциям. Вызов процедуры общего типа отличается от вызова процедуры-функции.

  • Чтобы вызвать процедуру общего типа или процедуру-функцию без параметров, достаточно записать ее имя в вызывающей процедуре: proc_A или b=func_b.
  • Фактические параметры процедуры общего типа (аргументы) отделяются от имени процедуры пробелом и перечисляются через запятую: proc_A arg1, arg2.
  • Аргументы функции перечисляются в скобках после имени функции: func_b(arg1, arg2).
  • Порядок перечисления аргументов соответствует порядку формальных параметров процедуры (функции).
  • Для вызова процедуры общего типа можно воспользоваться оператором Call, задавая значения аргументов в скобках Call proc_A(arg1, Arg2).
  • Процедура-функция не может быть выполнена командой Сервис-Макрос-Макросы, а может быть только вызвана другой процедурой или функцией.
  • Так как процедура-функция возвращает значение, она используется в выражениях, например, в операторе присваивания.
  • Процедура общего типа не может быть использована в выражениях, но может быть выполнена командой Сервис-Макрос-Макросы.

Напомним, что после выполнения вызванной процедуры происходит возврат к команде, следующей за вызовом процедуры.

Вызываемая процедура может находиться в том же модуле (проекте), что и вызвавшая ее процедура, или в другом модуле (проекте).

Важно

  • Поиск процедуры производится сначала в текущем модуле, а затем в других модулях проекта или других открытых проектах.
  • Если имя процедуры не является уникальным (в разных модулях проекта или в разных проектах объявлены процедуры с одинаковыми именами), то при вызове процедуры необходимо уточнить, о какой именно процедуре идет речь.

Это производится стандартным способом - в операторе вызова процедуры указывается составное имя процедуры, которое строится из имени проекта, имени модуля и имени процедуры, разделенных точкой:

ProjectName.ModuleName.ProcedureName

Например, вызов процедуры Proc_A, расположенной в модуле Module1 проекта Project1 можно записать так: Project1.Module1.Proc_A.

Замечание

  • Имя проекта не является именем рабочей книги.

Пример

Процедура высвечивает приветствие после ввода пользователем своего имени.

Пример основной и вызываемой процедуры

Рис. 7.1. Пример основной и вызываемой процедуры

В результате выполнения операторов 1-го и 2-го способов высвечивается приветствие "Hello, Conrad".

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Дмитрий Денисов
Дмитрий Денисов

Еще раз повторяю вопрос  - отправил договор и сканы документов по почте - в начале августа, до  5 го, внес предоплату - летом действовала скидка - чтобы пройти курс в августе, но я уезжал в Москву. По возвращению - и  в течение месяца - никакого ответа, никаких зачислений, ничего. Как проверить, пришли ли мои документы в Интуит, предоплата, почему нет зачисления.

Дмитрий Денисов
Дмитрий Денисов

Как записаться на курс, оплатить, не ориентируюсь в программе.

Ранее у Вас учился.

Работаю преподавателем, есть справка. Как получить скидку, т.е. оплата 2000


 

Елизавета Cафронова
Елизавета Cафронова
Россия, Выкса, НИТУ МИССиС
Иван Чуприков
Иван Чуприков
Россия, пгт. Чульман