2015-04-02 5 views
0

У меня есть таблица, где пользователь может определить некоторые правила, но я борюсь с тем, чтобы журнал работал. Я хочу, чтобы результаты разностного анализа основывались на том, чего хочет пользователь, но в идеале я хочу держаться подальше от них, но в нескольких случаях выбора или в строках.Оператор переменной переменной vba Excel

Что у меня есть это (упрощенный - это в цикле, так что значения будут изменяться для каждой строки - Я просто использую пример):

Оператор может меняться, это может быть «>», «=>» и т.д.

Field1Value = "Football" 
Operator1 = "=" 
Rule1 = "Football" 

If Evaluate(Field1Value & Operator1 & Rule1) Then 

'Run My Code 

End If 

Таким образом, в приведенном выше примере логика была бы правдой, и мой код будет работать, но я получаю ошибку несоответствия типов.

Есть идеи?

Благодаря Chris

******** ******** UPDATE

Вот полный код:

Workbooks(MasterWB).Activate 

Sheets("Rules").Select 

    NoRules = Sheets("Rules").Range("J6").End(xlDown).Row 

    For a = 7 To NoRules 

     Field1 = Workbooks(DataWB).Sheets(DataWS).Rows(1).Find(Workbooks(MasterWB).Sheets("Rules").Cells(a, 10), , xlValues, xlWhole).Column 
     Operator1 = Sheets("Rules").Cells(a, 11) 
     Rule1 = Sheets("Rules").Cells(a, 12) 

     Operator = Sheets("Rules").Range("J5").Cells(a, 13) 

     Field2 = Workbooks(DataWB).Sheets(DataWS).Rows(1).Find(Workbooks(MasterWB).Sheets("Rules").Cells(a, 14), , xlValues, xlWhole).Column 
     Operator2 = Sheets("Rules").Cells(a, 15) 
     Rule2 = Sheets("Rules").Cells(a, 16) 

     HighlightColumn = Workbooks(DataWB).Sheets(DataWS).Rows(1).Find(Workbooks(MasterWB).Sheets("Rules").Cells(a, 17), , xlValues, xlWhole).Column 
     HighlightColour = Workbooks(MasterWB).Sheets("Rules").Cells(a, 17).Interior.ColorIndex 

     Workbooks(DataWB).Activate 

     With Workbooks(DataWB).Sheets(DataWS) 

      .Select 

      Lastrow = .UsedRange.Rows.Count 

      For b = 2 To Lastrow 

      Field1Value = .Cells(b, Field1).Value 

       If Evaluate(Field1Value & Operator1 & Rule1) Then 

         .Cells(b, HighlightColumn).Interior.ColorIndex = HighlightColour      

       End If 

      Next b 

     End With 


    Next a 
+0

Возможно, вы предоставите код пожалуйста? –

ответ

0

попробовать что-то, как показано ниже:

Field1Value = "Football" 
Operator1 = "=" 
Rule1 = "Football" 

Dim x As Variant 

strEvaluate = Chr(34) & Field1Value & Chr(34) & Operator1 & Chr(34) & Rule1 & Chr(34) 

x = Evaluate("IF(" & strEvaluate & ",1,0)") 

if x = 1 then 
'Run your code 
end if 

Или вместо 1 и 0 использования TRUE и FALSE. Мой язык не английский. Но я думаю, что это тоже работает.

x = Evaluate("IF(" & strEvaluate & "," & True & ", " & False & ")") 

if x = TRUE then 
'Run your code 
end if 
+0

Отлично! Это получилось! Спасибо всем за помощь! – Walshie1987

2

Предполагая, что вы ожидая, что «Футбол» = «Футбол» даст True, затем задайте этот вопрос:

Примечание. Я приложил свои строки в кавычках - вам нужно передать их Evaluate()

Фактически, согласно моему чтению MS Docs, я не думаю, что это сработает.

Оценка (Имя)

Имя: формула или название объекта, используя именования Microsoft Excel. Длина имени должна быть меньше или равна 255 символам.

Какое определение «Футбол»? Это простая текстовая строка? Мое чтение указывает, что Evaluate() выполнит встроенную функцию или UDF, но не простое сравнение.

+0

Оценка только принимает литералы в соответствии с вашим ответом? Это ложь, приятель. –

2

Держись я не имею в виду, чтобы украсть кредит от FreeMan но следующие работал для меня:

Sub test() 
Dim Field1Value As String 
Dim Operator1 As String 
Dim Rule1 As String 

Dim test As Range 
Dim Passed As Boolean 

    Field1Value = "Football" 
    Operator1 = "=" 
    Rule1 = "Football" 

    Passed = Evaluate("=" & """" & Field1Value & """" & Operator1 & """" & Rule1 & """") 

    'Different way of achievieng same thing ignore this if you want to 
    Set test = Range("A1") 
    test.Formula = "=" & """" & Field1Value & """" & Operator1 & """" & Rule1 & """" 
    Passed = test.Value 

    MsgBox Passed 
End Sub 

Я попробовал это с несколькими значениями и оператором, и она отлично работает.

Поэтому я бы исправил FreeMan, добавив "=" & в первую часть Evaluate.

Итак, чтобы сделать это более кратким, я хочу сказать, написать так:

Evaluate("=" & """" & Field1Value & """" & Operator1 & """" & Rule1 & """") 
+0

Yup, это имеет смысл для меня. Я пропустил ведущий '='. – FreeMan

Смежные вопросы