Страницы: 1
RSS
Массив значений, как аргумент пользовательской функции, VBA
 
Хочу написать пользовательскую функции (чтобы вводить ее с листа).
Если пишу так:
Код
Public Function МояФункция(ByRef Значения1() As Double, ByRef Значения2() As Double) As Double
То в результате работы функции выдает ошибку "#ЗНАЧ!", но если пишу аргументы как диапазоны (Range), то все нормально работает:
Код
Public Function МояФункция(ByRef Значения1 As Range, ByRef Значения2 As Range) As Double
Я бы хотел использовать эту функцию и в контексте другой процедуры VBA кода, где туда будет передаваться массив значений, и на листе как самостоятельную функцию. Поэтому мне нужно чтобы аргументом был не диапазон, а именно массив.

Вопрос: Можно ли указать аргументом пользовательской функции массив, а не диапазон и как это сделать?
 
Цитата
Можно ли указать аргументом пользовательской функции массив, а не диапазон...?
Сначала диапазон в массив, а потом передавать.
 
vikttur,
Цитата
Я бы хотел использовать эту функцию и в контексте другой процедуры VBA кода, где туда будет передаваться массив значений, и на листе как самостоятельную функцию
Если эта функция будет использоваться в другой процедуре, туда будет передаваться не диапазон, а массив. Поэтому нужен именно аргумент-массив.
 
Покажите в файле как Вы хотите применять UDF. На листе и в другой процедуре
Согласие есть продукт при полном непротивлении сторон
 
Sanja, Имеется в виду, что в процедура не будет ссылаться на лист, а будет иметь собственный массив значений.
Изменено: GoGа - 07.04.2016 21:10:14
 
Зачем в таком случае формула на листе? Передали-посчитали-вернули-вывели результат на лист

В Вашем примере Вы передаете в функцию массивы. Работает. Что не так?
 
vikttur, нужна универсальная функция, которая может использоваться как на листе, принимая в качестве аргумента значения из указанного диапазона, так и в коде VBA, принимая в качестве аргумента внутренний массив значений. При этом процедура VBA имеет свой массив, никак не связанный с тем, что расположен на листе.
 
Получается вы хотите перегрузить функцию (здравствуй полиморфизм  :) ) Вроде есть такой волшебный слов
Overloads. На практике надо писать две функции с одним именем, но разным типом/количеством параметров.
Изменено: Udik - 07.04.2016 21:32:53
Арфы - нет, возьмите бубен.
 
Знаком с полиморфизмом и перегрузкой. Думал, что можно как-нибудь использовать одну единственную функцию в обоих случаях. Видимо - нет. Все равно всем спасибо.
 
Код
Public Function МояФункция(ByRef Значения1, ByRef Значения2) As Double
 
Цитата
GoGа написал:  как-нибудь использовать одну единственную функцию в обоих случаях.
Ну может быть можно сделать аргументы типа Variant а потом проверить на наличие чего-нибудь, что есть у range и нет у массива
Арфы - нет, возьмите бубен.
 
В принципе и ByRef не нужен
Код
Public Function МояФункция(Значения1, Значения2) As Double
Согласие есть продукт при полном непротивлении сторон
 
См. сообщение №10
 
Да, это и нужно, спасибо! Правда, придется заморочиться с проверкой на принятый аргумент, но это намного лучше, чем несколько функций с разными типами параметров.
 
Цитата
Sanja написал:
В принципе и ByRef не нуженКод ? 1Public Function МояФункция(Значения1, Значения2) As Double

Прикрепленные файлы
ПримерАргументыФункции (1).xlsm  (16.67 КБ)


Согласие есть продукт при полном непротивлении сторон.
Добрый день !!!
Вы не могли бы мне подсказать в чем причина. Я скачал Вашу функцию изменил на свой лад( она считала все правильно), потом  поменял наименование аргументов - вместо Значение1 - Погашение ( добавил аргументы Тело, Надбавка, Срок) - перестала правильно считать - не понятно откуда берутся цифры.  
 
Тагир, кнопка цитирования не для ответа. Вернитесь и сделайте из копиии всего нормальную цитату.
 
Авторы Excel VBA для обеспечения возможности "полиморфизма" придумали функции VarType и TypeName
Владимир
Страницы: 1
Читают тему
Наверх