Национальный исследовательский университет "Высшая Школа Экономики"
Опубликован: 01.04.2010 | Доступ: свободный | Студентов: 3836 / 673 | Оценка: 4.45 / 4.06 | Длительность: 08:48:00
ISBN: 978-5-9556-0119-9
Специальности: Программист
Лекция 7:

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

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >

Поименованные аргументы

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

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

Использование поименованных аргументов исключает влияние позиции аргумента на его интерпретацию. Для задания поименованных аргументов после названия формального параметра вызываемой процедуры поставьте оператор назначения - двоеточие и знак равенства ( := ), за которым укажите передаваемое значение аргумента.

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

  • Поименованные аргументы улучшают читабельность программы.
  • Исключаются ошибки, вызванные неверным порядком аргументов.
  • Облегчается перечисление аргументов в случае пропуска необязательных аргументов.

Используя поименованные аргументы, к функции расчета выплат можно было бы обратиться так: salary_em(ra:=r, ho:=h).

Пример

Процедура запрашивает имя и фамилию и составляет адрес электронной почты на Yandex из первой буквы имени и фамилии полностью.

Диалоговое окно запроса на ввод имени и фамилии размещается на экране, при этом используются координаты xpos=100 и ypos=100. В первом операторе InputBox применяются позиционные аргументы - пропущенные два аргумента отмечены запятыми. Во втором операторе InputBox используются поименованные аргументы.

Использование поименованных аргументов при вызове функции

Рис. 7.8. Использование поименованных аргументов при вызове функции

Функция Left выделяет первую букву имени. Подробно об аргументах функций InputBox и Left см. ниже.

Использование необязательных аргументов

Ключевое слово Optional, задаваемое при описании параметров процедуры, предполагает, что значение параметра не обязательно будет передано в процедуру. Иными словами, аргумент возможен, но необязателен.

Пример

Функция рассчитывает налоговые выплаты и имеет два параметра S - доход, R - ставка налога. Если ставка налога не задана, то налог рассчитывается, исходя из 13%.

  • Оператор Debug.Print NS(1000) в вызывающей процедуре распечатает в окне Immediate Window размер 13%-го налога.
    Вызов функции без указания необязательного параметра

    Рис. 7.9. Вызов функции без указания необязательного параметра
  • Оператор Debug.Print NS(1000, 0.1) выведет в это окно размер 10%-го налога от заданного дохода.
    Задание необязательного параметра при вызове функции

    Рис. 7.10. Задание необязательного параметра при вызове функции

Использование параметра ParamArray

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

Замечание

  • Используйте функцию Ubound для определения количества элементов в передаваемом массиве.

Пример

Создать функцию умножения аргументов.

Для умножения произвольного количества аргументов можно предложить два варианта функций:

  • с вычислением верхней границы передаваемого массива;
  • без вычисления верхней границы передаваемого массива.

В вызывающей процедуре mult_arr создается массив из восьми чисел, элементы которого перемножаются при помощи функций multr или multa.

Результат умножения выводится в окно Immediate Window.

Напомним, что нижняя граница массива равна 0, если инструкция OptionBase не указывает на другое.

Вызывающая процедура и оба способа записи функции

Рис. 7.11. Вызывающая процедура и оба способа записи функции
< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Дмитрий Денисов
Дмитрий Денисов

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

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

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

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

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


 

Денис Ермаков
Денис Ермаков
Россия
Alexander Vizelka
Alexander Vizelka
Россия