Excel VBA-如果/或未正确评估

Excel VBA-如果/或未正确评估,vba,excel,Vba,Excel,我使用下面的VBA代码对照名称列表检查Excel工作簿的名称,如果与任何名称都不匹配,则应显示一条消息。文件名为“C12-PICU Assignment Calculator.xlsm”,与下面列表中的一个名称匹配,但它仍然会生成消息说它不匹配 If ThisWorkbook.Name <> "Day Shift - Respiratory Care Cover Sheet.xlsm" _ Or ThisWorkbook.Name <> "Night Shift - Re

我使用下面的VBA代码对照名称列表检查Excel工作簿的名称,如果与任何名称都不匹配,则应显示一条消息。文件名为“C12-PICU Assignment Calculator.xlsm”,与下面列表中的一个名称匹配,但它仍然会生成消息说它不匹配

If ThisWorkbook.Name <> "Day Shift - Respiratory Care Cover Sheet.xlsm" _
Or ThisWorkbook.Name <> "Night Shift - Respiratory Care Cover Sheet.xlsm" _
Or ThisWorkbook.Name <> "C7 - SD-NICU Assignment Calculator.xlsm" _
Or ThisWorkbook.Name <> "C11 - TICU Assignment Calculator.xlsm" _
Or ThisWorkbook.Name <> "C12 - PICU Assignment Calculator.xlsm" _
Or ThisWorkbook.Name <> "D3 - CVICU Assignment Calculator.xlsm" _
Or ThisWorkbook.Name <> "D7 - NICU Assignment Calculator.xlsm" _
Or ThisWorkbook.Name <> "D9 - PULM Assignment Calculator.xlsm" _
Or ThisWorkbook.Name <> "General Floors Assignment Calculator.xlsm" _
Or ThisWorkbook.Name <> "Plano Assignment Calculator.xlsm" _
Then
    MsgBox "The name does not match."
End If

并显示它应该显示的“名称匹配”消息。

复合谓词为
true
。这就是显示消息“名称不匹配”的原因。。如果要检查是否与列表中的任何名称都不匹配,应使用
,而不是
,尝试以下代码:

Public Sub Match()

Dim wb As Workbook
Dim wbnames(1 To 10) As String
Dim i As Integer

Set wb = ActiveWorkbook
On Error Resume Next
MsgBox wb.Name

wbnames(1) = "Day Shift - Respiratory Care Cover Sheet.xlsm"
wbnames(2) = "Night Shift - Respiratory Care Cover Sheet.xlsm"
wbnames(3) = "C7 - SD-NICU Assignment Calculator.xlsm"
wbnames(4) = "C11 - TICU Assignment Calculator.xlsm"
wbnames(5) = "C12 - PICU Assignment Calculator.xlsm"
wbnames(6) = "D3 - CVICU Assignment Calculator.xlsm"
wbnames(7) = "D7 - NICU Assignment Calculator.xlsm"
wbnames(8) = "D9 - PULM Assignment Calculator.xlsm"
wbnames(9) = "General Floors Assignment Calculator.xlsm"
wbnames(10) = "Plano Assignment Calculator.xlsm"

For i = 1 To 10
  If wb.Name = wbnames(i) Then
  MsgBox "this workbook name matches" & wbnames(i)
  End If
Next

看起来OP中的想法是,
If
语句的计算结果是“如果A与B、C或D不匹配,或者……那么A与任何东西都不匹配”。这种“或”的用法在普通英语中是有意义的;然而,
If
语句要求“or”一词具有非常特定的含义,即在创建“or门”的上下文中使用“or”。这意味着它结合了逻辑测试,因此,如果任何单个测试为真,则整个测试为真。因此,
If
语句实际上是在评估“如果A B然后继续(即A不匹配任何东西)或者如果A C然后继续(即A不匹配任何东西)

更改为
可以通过将
If
语句转换为“And Gate”来解决问题,这要求每个单独的联合逻辑测试都为true,以使结果为true。这将逻辑更改为“(如果A B)和(如果A C)…则A与任何内容都不匹配”。或者,您可以将
比较更改为
=
,以便“如果A=B,则继续(即A匹配某个对象)或如果A=C,则继续(即A匹配某个对象)

最后,我建议您使用数组、列表、字典或集合之类的东西来进行任何包含测试。这有助于简化
if
语句,并将其焦点细化到其主要目的,即测试是否包含,而列表可以独立管理。这样,列表可以增长、收缩和修改,而不会影响测试包含的逻辑。下面是一个带有
ArrayList

Sub NameTest()
    Set NameList = CreateObject("System.Collections.ArrayList")
    NameList.Add "Day Shift - Respiratory Care Cover Sheet.xlsm"
    NameList.Add "Night Shift - Respiratory Care Cover Sheet.xlsm"
    NameList.Add "C7 - SD-NICU Assignment Calculator.xlsm"
    NameList.Add "C11 - TICU Assignment Calculator.xlsm"
    NameList.Add "C12 - PICU Assignment Calculator.xlsm"
    NameList.Add "D3 - CVICU Assignment Calculator.xlsm"
    NameList.Add "D7 - NICU Assignment Calculator.xlsm"
    NameList.Add "D9 - PULM Assignment Calculator.xlsm"
    NameList.Add "General Floors Assignment Calculator.xlsm"
    NameList.Add "Plano Assignment Calculator.xlsm"

    If NameList.Contains(ThisWorkbook.Name) Then
        MsgBox "The name matches"
    Else
        MsgBox "The name does not match."
    End If
End Sub

这不是一个答案,因为它已经由
@Amnon
提供,而是关于如何以更简单、更易读的方式实现相同结果的附加变量(只是为了扩展理解):

Sub test()
    Select Case ThisWorkbook.Name
        Case "Day Shift - Respiratory Care Cover Sheet.xlsm", _
                "Night Shift - Respiratory Care Cover Sheet.xlsm", _
                    "C7 - SD-NICU Assignment Calculator.xlsm", _
                        "C11 - TICU Assignment Calculator.xlsm", _
                            "C12 - PICU Assignment Calculator.xlsm", _
                        "D3 - CVICU Assignment Calculator.xlsm", _
                    "D7 - NICU Assignment Calculator.xlsm", _
                "D9 - PULM Assignment Calculator.xlsm", _
            "General Floors Assignment Calculator.xlsm", _
        "Plano Assignment Calculator.xlsm"
    Case Else
        MsgBox "The name does not match."
    End Select
End Sub

我明白你用AND而不是OR是什么意思,但为什么会这样?你能详细说明你的问题吗?@MatthewLozoya我开始在这里输入,但无法将其全部放在评论中。如果您还有问题,请参阅我发布的答案。希望这能有所帮助。
Sub test()
    Select Case ThisWorkbook.Name
        Case "Day Shift - Respiratory Care Cover Sheet.xlsm", _
                "Night Shift - Respiratory Care Cover Sheet.xlsm", _
                    "C7 - SD-NICU Assignment Calculator.xlsm", _
                        "C11 - TICU Assignment Calculator.xlsm", _
                            "C12 - PICU Assignment Calculator.xlsm", _
                        "D3 - CVICU Assignment Calculator.xlsm", _
                    "D7 - NICU Assignment Calculator.xlsm", _
                "D9 - PULM Assignment Calculator.xlsm", _
            "General Floors Assignment Calculator.xlsm", _
        "Plano Assignment Calculator.xlsm"
    Case Else
        MsgBox "The name does not match."
    End Select
End Sub