Видове процедури във VBA. Предаване/получаване на аргументи от една процедура на друга: оператори ByRef и ByVal

Безплатни 20 урока
регистрирай се и научи

Ако сте вече потребител - Регистриран съм
Видео

Тест за преминаване към следващия урок

 
По подразбиране стойностите на аргументите се предават с оператор:
ByRef
ByVal
 
Каква е разликата между Sub и Function процедурите?
Sub процедурите изпълняват действие (форматиране, изтриване, вмъкване и т.н.), а Function процедурите връщат единична стойност
Само Sub процедурите се показват в категорията User Defined на екселските функции
Само Function процедурите се записват с инструмента Macro Recorder
 
С оператор ByVal се запазва първоначалната стойност на аргумента
Вярно
Не вярно
 
Function процедура се използва в Excel и във VBA
Вярно
Не вярно

Въпроси и отговори

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

    Румен Драганов:

    Възможно ли е да се предаде като аргумент функция на VBA или друга потребителска функция? Например ако се опитаме да създадем процедура за определен интеграл с аргументи функцията, която ще интегрираме и границите на диапазона.

    Димитринка Вълкова:

    Да, възможно е - това е и темата на урока. Но ако срещаш проблем, опиши го и ще се опитам да помогна!

    Румен Драганов:

    Идеята беше няколко функции f1(x), f2(x)... да да се ползват алтернативно като аргументи на друга "главна" функция: G(f1, a, b). Всъщност се справих, като капсулирах функциите f(x) като методи на класове. След което предавам инстанции на тези класове като атрибути на главната функция.

    Димитринка Вълкова:

    Признавам, не съм решавала подобни задачи от висшата математика с VBA. Искрени поздравления!

    Cvetelina Raykova:

    Здравейте Румен, Може ли да дадете пример за използването на функции като аргументи в друга главна функция?

    Румен Драганов:

    Сложих един пример тук: http://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

    Cvetelina Raykova:

    Благодаря! Доста е сложно това за начинаещ с макросите.

    Румен Драганов:

    И на мен ми изглежда сложно, като го погледнах. За да обясняваш, трябва да си преподавател, пък аз не съм.