Страницы: 1
RSS
Присваивание значений необязательным аргументам пользовательской функции (UDF) в коде самой функции, как массово присвоить значение необязательным аргументам
 
Добрый вечер, коллеги!
При решении вопроса в ЭТОЙ теме написал UDF, которая подсчитывает количество уникальных значений по двум условиям.
У Автора той темы возник вопрос об увеличении количества условий поиска уникальных.
В процессе доработки возник вопрос : Как присвоить необязательным аргумента значения по умолчанию, НО не константы?

Объявление функции таким способом
Function СЧЁТУНИКЕСЛИМН(rngU As Range, _     rng1 As Range, kr1 As Variant, Optional rng2 As Range = rng1, Optional kr2 As Variant = kr1, .........)
конечно же привел к ошибке.

Доработал функцию таким методом, но, мне кажется, есть какой-то другой способ. Или мне действительно кажется?
Как быть при действительно большом количестве однотипных необязательных аргументов?
Спасибо
Скрытый текст
Изменено: Sanja - 27.03.2016 11:09:00
Согласие есть продукт при полном непротивлении сторон
 
При таком подходе можно лишь укоротить код, сделав цикл по всем аргументам. Т.е. заносим их предварительно в массив и циклом по нему, проверяя на Nothing или что там еще.
Хотя если надо "растягивать" на неопределенное кол-во аргументов - лучше применять ParamArray. Сейчас уже не успею накатать пример применения, но в сети и на форуме точно есть пример применения.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо. Тоже, примерно, так и предполагал (в смысле цикла по массиву)
Изменено: Sanja - 19.03.2016 23:32:54
Согласие есть продукт при полном непротивлении сторон
 
?
Скрытый текст
 
С.М., спасибо.
Сейчас сижу и с ParamArray пытаюсь реализовать, Что-бы от кол-ва аргументов вообще не зависеть.
По готовности выложу
Согласие есть продукт при полном непротивлении сторон
 
Как и обещал выкладываю реализацию UDF с ParamArray.
Вот только интересно, есть ли ограничения на количество аргументов в этом самом ParamArray?
Код
Function СЧЁТУНИКЕСЛИМН(rngU As Range, ParamArray Conditions()) As Long
Dim cl As Range
Dim arrFlag() As Boolean
Dim I As Long
On Error Resume Next
With New Collection
    For Each cl In rngU
        ReDim arrFlag(Int(UBound(Conditions) / 2))
        For I = LBound(Conditions) To UBound(Conditions) Step 2
            If Cells(cl.Row, Conditions(I).Column).Value Like Conditions(I + 1) Then
                arrFlag(Int(I / 2)) = True
            End If
        Next
        If WorksheetFunction.And(arrFlag) = True Then
            .Add cl, CStr(cl)
            If Err = 0 Then
                СЧЁТУНИКЕСЛИМН = СЧЁТУНИКЕСЛИМН + 1
            Else
                Err.Clear
            End If
        End If
    Next
End With
End Function
Согласие есть продукт при полном непротивлении сторон
Страницы: 1
Наверх