我在 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进行转换时,我遇到类型不匹配。
答案 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
复选框。
请注意这项技术的几个方面:
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公式。翻译不是一项微不足道的任务,而是一项有趣的任务。