Страницы: 1
RSS
VBA, массив условий для оператора if
 
Добрый день
Подскажите, пож, по следующему вопросу
Возможно ли создать массив, словарь, переменные или еще что-нибудь, где возможно хранить условия для оператора if? Не знаю, понятно ли описал задачу, ниже код для наглядности, что примерно хотелось бы получить. Не знаю существует ли что-то подобное или это мои фантазии...
Код
Sub aаaaa()

    Dim s As Variant
    Dim a As Long
    
    ReDim s(1 To 2)
    s(1) = "2=2 and 4>3"
    s(2) = "3=2"
    
    If s(1) Or s(2) Then a = 1
    
End Sub
Изменено: Ливиан - 01.03.2020 14:59:48 (исправил орфографическую ошибку)
 
Evaluate поможет?

В бы описали саму задачу, а не придуманный способ решения.
 
Цитата
vikttur написал:  Evaluate поможет?
не знаю что это такое... сейчас погуглю  и отпишусь
 
3=2  как это понять?
 
Цитата
vikttur написал:
В бы описали саму задачу, а не придуманный способ решения.
Да, Вы правы.
Ситуация такая, есть файлы Excel с  БД с большим количеством столбцов. Которые обрабатываются макросами. Например, найти среднее значение, минимум... столбца по нескольким условиям, например столбец 2 больше 3 и меньше 10, столбец 4 равен 5 и т.д. Таких условий может быть и 5 и 55... и в день по несколько вариантов...
Приходится постоянно редактировать макрос, добавлять и убавлять условия... Задумался как это можно делать быстро. Один из вариантов, какие пришли в голову, что  записываю все условия в ячейки (чтобы не лезть в макрос), конкатенирую их через запятую и подставляю их каким-то способом как условие оператора if ... Глупость наверно, просто пытаюсь понять куда же рыть целесообразнее и какие в принципе существуют возможности
Изменено: Ливиан - 01.03.2020 13:16:06 (отредактировал)
 
Ливиан. все же не хватает самих переменных, которые мы будем подставлять в эти условия.
 
Код
Sub test()
    Dim a(1 To 2, 1 To 4)
    Dim s, k
    
    a(1, 1) = "2=2"
    a(1, 2) = "4>3"
    a(1, 3) = "*"
    a(1, 4) = "+"
    
    a(2, 1) = "2+2" 
    ' ..........
    
    s = Evaluate(a(1, 1))
    k = Evaluate(a(1, 2))
    Debug.Print Evaluate(s & a(1, 3) & k)
    Debug.Print Evaluate(s & a(1, 4) & k)
    
    s = "(" & a(1, 1) & ")" & a(1, 3) & "(" & a(1, 2) & ")"
    k = "(" & a(1, 1) & ")" & a(1, 4) & "(" & a(1, 2) & ")"
    Debug.Print Evaluate(s)
    Debug.Print Evaluate(k)
End Sub
 
vikttur, спасибо за код, пока не знаю, смогу ли это к своей задаче применить - в силу того, что нужно время, чтобы разобраться с этой функцией и ее ограничениями... и думаю, что немало :(
Боюсь, придется мне Вас донимать вопросами сегодня, завтра, послезавтра...

Цитата
skais675 написал: Ливиан. все же не хватает самих переменных...
Переменные - это столбцы с условиями, которых может быть разное количество. Создал пример, с БД и таблицей с названиями столбцов и с условиями. Задача - посчитать сумму (или 2-й минимум, или среднее за минусом одного максимума и одного минимума...) по столбцу 8, при выполнении условий для столбцов БД. Возможен ли такой макрос - универсальный, когда не нужно его корректировать, а при увеличении/уменьшении количества столбцов с условиями - просто вносить соответствующие изменения в столбцы K и L на Рабочий Лист и макрос автоматически эти изменения учтет?
Изменено: Ливиан - 01.03.2020 14:03:30 (отредактировал)
 
попробовал так
Код
 t = Evaluate("2<4<5")
возвращает Ложь
 
Цитата
Ливиан написал: нужно время, чтобы разобраться с этой функцией
Особо и нечегт разбираться. Функция ВЫЧИСЛЯЕТ текстовую строку. Нужно только правильно подсталять условия. Лучше, как в первом варианте в примере (отдельные переменные , так меньше вероятности ошибки) -  вычислять отдельные составляющие условия.

Цитата
t = Evaluate("2<4<5")
Непрвильно составили условие. Вычисляем:
2 < 4 = True, после этого True < 5 = False
Для этого случая праввильное условие: 2 < 4  And 4 < 5 или 4 > 2 And 4 < 5. В массив заносится два условия сравнения и оператор *.
Вообще, все операторы можно выделить в один массив, константы - в другой, ссылки - в третий. И уже из этих массивов формировать любые условия.
 
vikttur, с оператором AND понял, спасибо.  Разбираюсь с OR... в Вашем примере Debug.Print Evaluate(k) возвращает 2, т.е. OR - это сложение условий и если результат отличен от 0, то это Истина?

Цитата
Юрий М написал: 3=2  как это понять?
не увидел сообщение, сорри. хотел показать в примере одно условие возвращающее Истину и одно Ложь  
 
Or (ИЛИ) - оператор логический.  Для Evaluate привычнее иметь дело с математическими операторами, поэтому логику для условий меняем на математику (+ вместо Or).
Любое число, отличное от нуля, в логическом понимании - ИСТИНА. Т.е. оператору If-Then безразлично, число ему подставляют (число или логику), он вернет True/False.
 
Цитата
vikttur написал: Or (ИЛИ) - оператор логический.// Любое число, отличное от нуля, в логическом понимании - ИСТИНА
vikttur, спасибо за ликбез. Я почему-то думал, что только 1 - это истина...
Цитата
все операторы можно выделить в один массив, константы - в другой, ссылки - в третий. И уже из этих массивов формировать любые условия.
vikttur, спасибо большое, попробую сделать по Вашему совету
Страницы: 1
Наверх