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

我有一个单元格A1中的文本如下

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

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

我试图使用评估function,它不工作

当我读这个单元格时,它总是返回双引号括起来的stringtypes。 因此它被视为string而不是评估布尔expression式。

 "((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 

我也试图存储在布尔variables

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

因为它是string,当我尝试使用CBool​​进行转换时,出现types不匹配

任何人都可以请帮忙?

提前致谢。

这是你可以用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东西(在我的答案中评论),尝试从它build立一个公式,并评估它。

例如, TRUE AND FALSE应该被翻译为=AND(TRUE,FALSE) 。 这是由VBA容易评估,因为它是一个Excel公式。 翻译不是一项简单的任务,而是一个有趣的任务。

你可以尝试这样的事情,利用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 

除了这个问题的被接受的答案,你可以使用这个代码:

 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 modelTrust access to the VBA project object modelcheckbox。

在这里输入图像说明

只要注意一下这个技术的一些事情:

  • 它很慢
  • 有可能有很多方法会打破其他的事情
  • 它很容易被恶意用户注入代码,例如他们可能会input类似Sheet1.Cells.Delete而不是(True And False etc)