评估Excel VBA布尔条件(不是公式)

时间:2017-11-14 10:53:01

标签: excel vba excel-vba

我在 A1 单元格中有文字,如下所示

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

我需要评估此文本并使用 VBA代码将布尔结果(True / False)放入另一个单元格 B1

我尝试使用评估功能,但它无效。

当我读取这个单元格时,它总是返回字符串类型,双面括号括起来。因此它被视为字符串而不是评估布尔表达式。

"((True And True Or True) And (True And (True))) And (True Or True)"

我想这样写,但它不起作用

If Range("A1").Value = True Then
    Range("B1").Value = True
Else
    Range("B1").Value = False
End If

我试图在布尔变量中存储

Dim Result as Boolean
Result = CBool(Range("A1").Value) 

因为它是字符串,当我尝试使用CBool​​进行转换时,我遇到类型不匹配。

3 个答案:

答案 0 :(得分:3)

你可以尝试这样的事情,利用Access中的Eval功能。

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

答案 1 :(得分:3)

继续接受此question的答案后,您可以使用以下代码:

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

您需要勾选信任中心设置中的Trust access to the VBA project object model复选框。

enter image description here

请注意这项技术的几个方面:

  • 很慢
  • 有很多方法可以打破其他事情
  • 它易受恶意用户的代码注入攻击,例如他们可能会输入Sheet1.Cells.Delete而非(True And False etc)
  • 之类的内容

答案 2 :(得分:1)

这是您可以使用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

如果你想解析TRUE and FALSE的东西(在我的回答中评论),尝试从中构建一个公式并进行评估。

,例如,TRUE AND FALSE,应翻译为=AND(TRUE,FALSE)。这可以通过VBA轻松评估,因为它是Excel公式。翻译不是一项微不足道的任务,而是一项有趣的任务。