Evaluate Excel VBA boolean condition (not a formula)

前端 未结 3 513
孤城傲影
孤城傲影 2021-01-13 17:02

I have text in a cell A1 as below

((True And False Or True) And (True And (Not True))) And (False Or True)

I need to evalu

相关标签:
3条回答
  • 2021-01-13 17:17

    Further to the accepted answer for this question you can use this code:

    Option Explicit
    
    Sub Test()
    
        Debug.Print VBABooleanEvaluateOnTheFly("((True And False Or True) And (True And (Not True))) And (False Or True)")
        Debug.Print VBABooleanEvaluateOnTheFly("((True And True Or True) And (True And (True))) And (True Or True)")
        Debug.Print VBABooleanEvaluateOnTheFly("True")
        Debug.Print VBABooleanEvaluateOnTheFly("False")
        Debug.Print VBABooleanEvaluateOnTheFly("False Or True")
    
    End Sub
    
    Function VBABooleanEvaluateOnTheFly(strExpression As String) As Boolean
    
        Dim blnResult As Boolean
        Dim objVBComponent As Object
    
        Set objVBComponent = ThisWorkbook.VBProject.VBComponents.Add(1)
        With objVBComponent
            .CodeModule.AddFromString "Function foo() As Boolean: foo = " & strExpression & ": End Function"
            If Application.Run(.Name & ".foo") Then
                blnResult = True
            Else
                blnResult = False
            End If
        End With
        ThisWorkbook.VBProject.VBComponents.Remove objVBComponent
    
        VBABooleanEvaluateOnTheFly = blnResult
    
    End Function
    

    You will need to tick the Trust access to the VBA project object model checkbox in the Trust Center settings.

    Just to note a couple of things with this technique:

    • it is slow
    • there are likely a lot of ways it will break other things
    • it is vulnerable to code injection by a malicious user e.g. they may enter something like Sheet1.Cells.Delete instead of (True And False etc)
    0 讨论(0)
  • 2021-01-13 17:26

    You could try something like this, taking advantage of the Eval function in Access.

    Public Function EvaluateExpression(Value As String) As Boolean
        With CreateObject("Access.Application")
            EvaluateExpression = .Eval(Value)
        End With
    End Function
    
    Public Sub T()
        Debug.Print EvaluateExpression("((True And True Or True) And (True And (True))) And (True Or True)")
    End Sub
    
    'True
    
    0 讨论(0)
  • 2021-01-13 17:34

    This is what you can do with VBA .Evaluate:

    Option Explicit
    
    Public Sub TestMe()
    
        Dim cell01  As Range
        Dim cell02  As Range
    
        Set cell01 = Range("A1")
        Set cell02 = Range("A2")
    
        Range("A1") = "1+2+3+4+5"
        Range("A2") = "TRUE and FALSE"
    
        Debug.Print Evaluate(CStr(cell01))
        'Debug.Print CBool(cell02) - this will be an error!
        Debug.Print Evaluate(CBool("True") And CBool("False"))
    
        Debug.Print Evaluate("=AND(TRUE,FALSE)")
        Debug.Print Evaluate("=AND(TRUE,TRUE)")
        Debug.Print Evaluate("=OR(TRUE,TRUE)")
    
    End Sub
    

    If you want to parse the TRUE and FALSE thing (commented in my answer), try to build a formula out of it and to evaluate it.

    E.g., TRUE AND FALSE, should be translated to =AND(TRUE,FALSE). This gets evaluated easily by VBA as it is an Excel Formula. The translation is not a trivial task, but an interesting one.

    0 讨论(0)
提交回复
热议问题