Страницы: 1
RSS
Замена оператора сравнения (=;<>; и т.п.) на переменную.VBA
 
Добрый день, коллеги.
Давно мучает вопрос упрощения использования операторов сравнения в UDF (и не только)
Например, когда нужно использовать оператор в критерии отбора.
Видел как Дмитрий (The_Prist) вышел из подобной ситуации
Смотрю в сторону Application.Evaluate, но...то ли лыжи не едут
При пошаговом проходе по второй функции, отслеживая Application.Evaluate("If(" & rng2.Parent.Cells(cl.Row, rng2.Column) & kr & ")"), в Watches, вообще непоняные мне значения (числовое значение критерия умноженное на 100, иногда True).
Надеялся, что будут True/False
Ниже код UDF с жестко прописанным оператором и попытка ее унифицировать. И файл-пример их использования
Натокните на мысли. Или развейте надежды
Спасибо
Скрытый текст
Согласие есть продукт при полном непротивлении сторон.
 
А знак ">" не пропустили часом? И "If" там не надо.  
 
Где "не пропустили"? Без If тоже пробовал - возвращает ноль
Согласие есть продукт при полном непротивлении сторон.
 
Здесь:
Код
rng2.Parent.Cells(cl.Row, rng2.Column) & ">" & kr
 
">" вставлен в формулу (Уникальных 2, голубая ячейка). В этом и фишка, что-бы эти операторы вставлять в формулу, а не менять их в коде
Согласие есть продукт при полном непротивлении сторон.
 
А, тогда понятно, просто файл не смотрел. Не работает, потому что Evaluate - буржуйская функция, и числа ей нужно "скармливать" тоже в буржуйском формате, т.е. например не "0,4", а "0.4".
ЗЫ. "If" там все же не нужен.
 
Проблема кажется из-за того, что Вы не завершили функцию ЕСЛИ
Попробуйте так:
Код
If Application.Evaluate("If(" & rng2.Parent.Cells(cl.Row, rng2.Column) & kr & ",true)") Then
у меня написала 12
Не стреляйте в тапера - он играет как может.
 
Цитата
Влад написал: числа ей нужно "скармливать" тоже в буржуйском формате
Спасибо.
Вот так получилось
Код
Function СЧЁТУНИКЕСЛИ_(rng1 As Range, rng2 As Range, kr As String) As Double
'аргументы:
'rng1 - диапазон отбора уникальных значений, обязательный
'rng2 - диапазон условий, обязательный
'kr - условие (критерий), обязательный
On Error Resume Next
kr = Replace(kr, ",", ".")
    With New Collection
        For Each cl In rng1
            vCl = Replace(rng2.Parent.Cells(cl.Row, rng2.Column), ",", ".")
            If Application.Evaluate(vCl & kr) Then
                .Add cl, CStr(cl)
                If Err = 0 Then
                    СЧЁТУНИКЕСЛИ_ = СЧЁТУНИКЕСЛИ_ + 1
                Else
                    Err.Clear
                End If
            End If
        Next
    End With
End Function
Изменено: Sanja - 19.07.2016 11:45:20
Согласие есть продукт при полном непротивлении сторон.
 
Цитата
Ts.Soft написал:
не завершили функцию ЕСЛИ
Завершил. 12 не получил. Запятые на точки меняли?
Согласие есть продукт при полном непротивлении сторон.
 
Цитата
Sanja написал:
Запятые на точки меняли?
Нет, у меня и так точки везде. Но без ,true выдавала при открытии файла 52, а после пересчёта 0, после добавления ,true выдала 12
Не стреляйте в тапера - он играет как может.
 
Ts.Soft, спасибо. Ваш вариант тоже рабочий, но с условием корректного системного разделителя. Основное, все таки, точки  :)
Еще раз всем спасибо
Изменено: Sanja - 19.07.2016 11:31:26
Согласие есть продукт при полном непротивлении сторон.
Страницы: 1
Читают тему (гостей: 1)
Наверх