Как да предадем аргумент-функция?
Възможно ли е да се предаде като аргумент функция на VBA или друга потребителска функция? Например ако се опитаме да създадем процедура за определен интеграл с аргументи функцията, която ще интегрираме и границите на диапазона.
Да, възможно е - това е и темата на урока. Но ако срещаш проблем, опиши го и ще се опитам да помогна!
Идеята беше няколко функции f1(x), f2(x)... да да се ползват алтернативно като аргументи на друга "главна" функция: G(f1, a, b). Всъщност се справих, като капсулирах функциите f(x) като методи на класове. След което предавам инстанции на тези класове като атрибути на главната функция.
Признавам, не съм решавала подобни задачи от висшата математика с VBA. Искрени поздравления!
Здравейте Румен, Може ли да дадете пример за използването на функции като аргументи в друга главна функция?
Сложих един пример тук: https://dox.bg/files/dw?a=c99ac2c4b1 Създадох абстрактен клас (само интерфейс), който използвам в главната функция F_Integral. Правя му две (или повече) различни имплементации за различните функции, които ми трябват - в примера ги чета от таблицата, но може и да се напишат. Като аргументи в главната функция изпращам инстанции от класовете - наследници и така избирам с коя функция да работя.
А ето и по-прост начин
'G - "главна" функция, Fnc е функция, изпратена като стринг
Function G(ByVal Fnc As String, ByVal x As Double) As Double
Dim FncRep As String
'замествам "x" със стойността на променливата х:
FncRep = Replace(Fnc, "x", Str(x))
' ...и изчислявам
G = Evaluate(FncRep)
End Function
и
Sub test()
Dim f1, f2 As String
Dim res As Double
'тук дефинирам функциите - аргументи като стрингове:
f1 = "sin(x)"
f2 = "cos(x)"
res = G(f1, Application.Pi() / 3)
MsgBox ("sin(pi/3)=" + Str(res))
res = G(f2, Application.Pi() / 4)
MsgBox ("cos(pi/4)=" + Str(res))
End Sub
Благодаря! Доста е сложно това за начинаещ с макросите.
И на мен ми изглежда сложно, като го погледнах. За да обясняваш, трябва да си преподавател, пък аз не съм.
Sub a() MsgBox "Sub A" End Sub
Sub B() MsgBox "Sub B" End Sub
Sub AorB(ByVal f As String) Application.Run (f) End Sub
Sub Test() AorB ("b") End Sub