- •Университет машиностроения
- •Иногда часть кода можно использовать
- •Определения
- •Определения
- •Последовательность выполнения
- •Способы передачи параметров
- •Области видимости и экранирование имён
- •Повторное использование кода Библиотеки функций
- •«Расширенные» возможности параметров
- •«Полезные» диалоговые функции
- •Университет машиностроения Кафедра «Автоматика и процессы управления»
Университет машиностроения
Кафедра «Автоматика и процессы управления»
Дисциплина
Информационные технологии
2 семестр
Тема 06
Функции и процедуры
(Язык VBA for Ms Excel)
Информатика. 2 семестр. Тема 06. Функции
Иногда часть кода можно использовать
несколько раз… |
(подпрограммы) |
|
Очень часто несколько копий кода различаются
только именами переменных… |
(аргументы) |
|
Как правило есть большие фрагменты кода, которые выполняют просто описываемое действие…
Бывают случаи когда нужно повторить действия с изменённым набором параметров… (рекурсия)
Информатика. 2 семестр. Тема 06. Функции
Определения
Подпрограмма – логически обособленный блок инструкций, предназначенный для многократного использования.
GoSub МеткаПодпрограммы
* * *
МеткаПодпрограммы: Statements
Return
Процедура – особый вид функции, не возвращающий значение.
Sub ИмяПроцедуры( Аргументы ) Statements
End Sub
Вызов процедуры: Call ИмяПроцедуры( x )
Отображение:
«Подпрограмма»
п/п
Предопределенный
процесс
Go(x)
Информатика. 2 семестр. Тема 06. Функции
Определения |
|
|
Отображение: |
|||||
Функция – специально организованный набор |
Предопределенный |
|||||||
инструкций, который может быть запущен с |
процесс (функция) |
|||||||
использованием имени функции, и возвращающий |
|
|
|
|
|
|
||
итоговое значение, используемое в месте её вызова |
|
|
|
|
|
|
||
|
|
|
Go(x) |
|
|
|||
Function ИмяФункции( Аргументы ) As ТипРезультата |
|
|
|
|
||||
Statements |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ИмяФункции = Expression |
‘ Результат функции |
|
|
|
|
|
|
|
End Function |
|
|
|
|
|
|
|
|
Вызов функции: y = ИмяФункции( x ) |
|
|
|
|
|
|
||
алгоритм |
функция |
основной (main) |
|
|
вычислитель |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y = f(x) |
|
|
|
|
x+1 → ret. |
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Информатика. 2 семестр. Тема 06. Функции
Последовательность выполнения
Выполнение кода функции предваряется операциями по выделению памяти для локальных переменных и результата функции, а также копированию значений параметров (аргументов)
стек xz
y f ()
результат
параметр B( z )
параметр A (x )
адрес возврата
лок. перемен. D
лок. перемен. C
копия регистров
резерв стека
Function F (A, B As Integer) As Integer Dim C, D As Integer
Псевдокод для y = F ( x, z ):
1 Зарезервировать место под результат
2 Зарезервировать место для аргументов
3 Скопировать значения аргументов
4 Выделить место под локальные переменные
5 Подготовить запуск функции
6 Выполнить код функции и получить результат
F = A + B + C + D ‘ return result
7 Скопировать результат, очистить стек и память 8 Использовать результат для вычисления y
Результат выполнения кода функции используется в основном коде
Информатика. 2 семестр. Тема 06. Функции
Способы передачи параметров
В VBA параметры в функции и процедуры можно передавать
по-значению (byVal) либо по-ссылке (byRef)
По-значению (byVal) |
По-ссылке (byRef) |
y |
x z |
Копируются значения |
||
f () |
|
Сохраняются ссылки |
||
значение функц. |
A = 1 |
|
||
B: значение из z |
|
|||
|
|
|||
A: значение из x |
Работа с |
Работа через |
||
адрес возврата |
«копиями» |
|||
ссылки с |
||||
лок. перемен. D |
|
|||
лок. перемен. C |
|
исходными |
||
копия регистров |
|
ячейками |
||
|
|
«Копии» |
|
|
резерв стека |
удаляются |
|
y x z
f ()
значение функц.
@B: адрес для z
@A: адрес для x
адрес возврата
лок. перемен. D
лок. перемен. C
копия регистров
резерв стека
По-умолчанию в VBA параметры передаются по-ссылке – так быстрее
Информатика. 2 семестр. Тема 06. Функции
Области видимости и экранирование имён
В VBA функция скрывает свои переменные от «внешнего кода» и экранирует имена «внешних объектов» если они совпадают с локальными переменными и именами параметров
A x z
B C D
результат
параметр B ( z )
параметр A ( x )
адрес возврата
лок. перемен. D
лок. перемен. C
копия регистров
резерв стека
Dim A, B, C, D, X, Z As Integer
Y = F ( X , Z ) |
|
|
Function F ( A , B |
As Integer) As Integer |
|
Dim C, D As Integer |
||
C = A + X |
‘ equal X + X |
|
D = B + Module1.B |
‘ equal Z + B |
F = A + B + C + D ‘ only internal variables
Хорошим тоном считается написание кода функций с использованием только имён локальных переменных и параметров
Информатика. 2 семестр. Тема 06. Функции
Повторное использование кода Библиотеки функций
Если функция не зависит от «внешних» объектов, её можно вызвать из другого модуля или вынести в отдельный модуль (если она видна)
MainModule |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LibModule |
||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
k = f(z) |
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||
|
|
|
y = f(x) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function f() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
При необходимости, функции одного |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
модуля могут использовать общие |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
объекты (переменные) для хранения |
|
|
|
|
|
|
|
|
f1(x) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f2(z) |
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
важных значений (настроек) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Такой модуль – это аналог
статического класса Принцип ООП:
Инкапсуляция – скрытие «реализации»
Информатика. 2 семестр. Тема 06. Функции
«Расширенные» возможности параметров
В VBA структуры (переменные пользовательских типов – Type) могут использоваться в качестве параметров и результатов функций
Function F ( A, B As NewType) As OtherType Dim Res As OtherType
…smth statements…
F = Res ‘ В VBA нельзя напрямую управлять результатом End Function
В VBA допускается использование необязательных аргументов
Function F ( Optional S As String = “Default”) As String …smth statements…
F = S ‘ При вызове функции можно не указывать аргумент End Function
ВVBA можно указывать аргументы по имени при вызове функции
Res = F (S := “Hello World”) ‘ Если опциональных аргументов несколько
ВVBA можно создавать функции с переменным числом аргументов
Function F (S As String, ParamArray OtherArgs() ) As Integer
F = OtherArgs(1) + OtherArgs(2) ‘ Желательно использовать UBound
Информатика. 2 семестр. Тема 06. Функции
«Полезные» диалоговые функции
Для немедленного сообщения пользователю используется MsgBox
MsgBox (Prompt [, Buttons] [, Title] [, HelpFile, HelpContext])
Res = MsgBox(“Шеф, всё пропало”, vbOKOnly, “Окно ошибки”)
‘ MsgBox возвращает код кнопки как целочисленную константу (vbOK = 1)
Для срочного получения данных от пользователя используется InputBox
InputBox (Prompt [, Title] [, Default] [, XPos] [, YPos] [, HelpFile, HelpContext])
Res = InputBox(“Введите X”, “Запрос данных”, 10)
И ещё кое-что о функциях в VBA:
Функции можно вызывать как процедуры: Call MyFunc(“Hello”) Функции можно применить как операторы: MyFunc “Hello”
Если Function MyFunc (S As String ) As Variant
Информатика. 2 семестр. Тема 06. Функции