Как да предадем аргумент-функция?

Microsoft Excel Електронни таблици Microsoft 365 Excel VBA Програмиране VBA за Excel

Възможно ли е да се предаде като аргумент функция на 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


Вашият отговор

Научи компютърните програми онлайн от топ експертите на България
Регистрацията в АУЛА ви дава:
  • 20 безплатни урока
  • Трикове и тънкости за софтуера
  • Отговори на вашите въпроси
  • Регистрация