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