使用标准布尔语法在Excel中计算多个布尔项的方法是什么?

使用标准布尔语法在Excel中计算多个布尔项的方法是什么?,excel,vba,Excel,Vba,在Excel中,不能使用Application.Evaluate函数来处理诸如“=true和true”之类的术语。它必须写为“=和(真,真)”。这会出现一个问题,即不能对可读的布尔术语使用标准语法,也不能让Excel VBA进行计算。我有一些相当长的布尔术语字符串,它们可以具有动态关系集,例如“(true and(true或false))或false或false”。用Excel格式写这篇文章会让人困惑,而开发一个能够解释任何术语组合的解析工具可能是更值得做的工作 有没有人知道有什么方法可以简化这

在Excel中,不能使用Application.Evaluate函数来处理诸如“=true和true”之类的术语。它必须写为“=和(真,真)”。这会出现一个问题,即不能对可读的布尔术语使用标准语法,也不能让Excel VBA进行计算。我有一些相当长的布尔术语字符串,它们可以具有动态关系集,例如“(true and(true或false))或false或false”。用Excel格式写这篇文章会让人困惑,而开发一个能够解释任何术语组合的解析工具可能是更值得做的工作


有没有人知道有什么方法可以简化这一过程,或者有什么工具或代码可以弥补这一差距?

在阅读了BigBen提供的一些相关文章后,我决定只编写解决方案

我相信它可以从一些效率优化中受益,并且它不考虑扩展的布尔逻辑,比如XOR等。它只处理and、OR、and,而不是。但这比我在其他地方能找到的都多

此代码中的方法是将整个字符串分解为一层字符串(由括号确定),然后使用AND和OR的操作顺序处理每一层逻辑。接下来,它用单个结果true或false替换每一层术语,然后继续到下一层,直到到达逻辑的顶层。该函数返回一个字符串,以便它可以调用自己,并将结果无缝地输入到原始字符串计算中

Public Function EvaluateBooleanString(BooleanString As String) As String
Dim StrPos As Integer
Dim TermStartPos As Integer
Dim TermEndPos As Integer
Dim DepthCounter As Integer
Dim SubBool As String
Dim OrArray() As String
Dim AndArray() As String
Dim OrCounter As Integer
Dim AndCounter As Integer
Dim AndArgs As String
Dim OrArgs As String

TermStartPos = 0
TermEndPos = 0

For StrPos = 1 To Len(BooleanString)

    If Mid(BooleanString, StrPos, 1) = "(" Then
        DepthCounter = DepthCounter + 1
        If DepthCounter = 1 Then TermStartPos = StrPos
    End If

    If Mid(BooleanString, StrPos, 1) = ")" Then
        If DepthCounter = 1 Then
            TermEndPos = StrPos
            DepthCounter = DepthCounter - 1
            SubBool = EvaluateBooleanString(Mid(BooleanString, TermStartPos + 1, (TermEndPos - TermStartPos) - 1))
            BooleanString = Left(BooleanString, TermStartPos - 1) & SubBool & Right(BooleanString, Len(BooleanString) - TermEndPos)
            TermStartPos = 0
            TermEndPos = 0
            StrPos = 1
        End If
    End If
Next StrPos

BooleanString = Replace(BooleanString, "OR", "|", , , vbTextCompare)
BooleanString = Replace(BooleanString, "AND", "&", , , vbTextCompare)

OrArray = Split(BooleanString, "|")
For OrCounter = LBound(OrArray) To UBound(OrArray)
    AndArray = Split(OrArray(OrCounter), "&")
    If LBound(AndArray) < UBound(AndArray) Then
        For AndCounter = LBound(AndArray) To UBound(AndArray)
            AndArgs = AndArgs & AndArray(AndCounter) & ","
        Next AndCounter
        AndArgs = Left(AndArgs, Len(AndArgs) - 1)
    Else
        AndArgs = AndArray(0)
    End If
    AndArgs = Replace(AndArgs, "not true", "false", , , vbTextCompare)
    AndArgs = Replace(AndArgs, "not false", "true", , , vbTextCompare)
    OrArray(OrCounter) = Application.Evaluate("=AND(" & AndArgs & ")")
    AndArgs = ""
    OrArgs = OrArgs & OrArray(OrCounter) & ","
Next OrCounter
OrArgs = Left(OrArgs, Len(OrArgs) - 1)
OrArgs = Replace(OrArgs, "not true", "false", , , vbTextCompare)
OrArgs = Replace(OrArgs, "not false", "true", , , vbTextCompare)
If LBound(OrArray) < UBound(OrArray) Then
EvaluateBooleanString = Application.Evaluate("=OR(" & OrArgs & ")")
Else
EvaluateBooleanString = OrArgs
End If
End Function
公共函数EvaluateBooleanString(BooleanString作为字符串)作为字符串
将StrPos设置为整数
Dim TermStartPos作为整数
Dim TermEndPos为整数
Dim DepthCounter作为整数
作为字符串的Dim SubBool
Dim OrArray()作为字符串
Dim AndArray()作为字符串
作为整数的Dim或counter
Dim AND计数器为整数
调暗和标记为字符串
作为字符串的Dim OrArgs
TermStartPos=0
TermEndPos=0
对于StrPos=1到Len(布尔字符串)
如果Mid(BooleanString,StrPos,1)=”()则
深度计数器=深度计数器+1
如果DepthCounter=1,则TermStartPos=StrPos
如果结束
如果Mid(布尔字符串,StrPos,1)=“”,则
如果DepthCounter=1,则
TermEndPos=StrPos
深度计数器=深度计数器-1
SubBool=EvaluateBooleanString(Mid(布尔字符串,TermStartPos+1,(TermEndPos-TermStartPos)-1))
BooleanString=Left(BooleanString,TermStartPos-1)和SubBool&Right(BooleanString,Len(BooleanString)-TermEndPos)
TermStartPos=0
TermEndPos=0
StrPos=1
如果结束
如果结束
下一步战略目标
BooleanString=替换(BooleanString,“或”、“|”、、vbTextCompare)
BooleanString=Replace(BooleanString,“AND”、“&”、”vbTextCompare)
OrArray=Split(布尔字符串,“|”)
对于OrCounter=LBound(OrArray)到UBound(OrArray)
AndArray=拆分(OrArray(或计数器),“&”)
如果LBound(AndArray)
application.evaluate过程公式。有没有办法将布尔值字符串直接输入VBA?。我不认为你有很多好的选择。我想也许你可以像使用数组公式一样将AND转换成*和/或+呢?这似乎有效,但如果您没有参与评估,我不确定您将如何进行。是的,遗憾的是,问题已经结束,我希望有机会提交(比如)评估(替换)(替换(逻辑,“and”、“*”、“+”)的想法)其中,逻辑是一个包含布尔表达式的字符串,即使它被击倒。@TomSharpe-我已投票重新打开,希望这会得到支持,以便您可以发布答案。(虽然现在我重读了一遍,我想你必须处理
而不是
s)。