Excel VBA中的If Then ElseIF语句

Excel VBA中的If Then ElseIF语句,vba,excel,if-statement,Vba,Excel,If Statement,我正在编写一个运行数据库搜索的脚本。它是通过一个IF语句来实现的,该语句包含几个条件,这些条件取决于用户在三个不同字段(“国家”、“类别”和“子类别”)中的输入。我以前定义过这些 用户在三个字段中输入的不同组合将产生不同的结果。因此,例如,如果用户未提供“国家”,则搜索将不会运行,并会弹出错误消息,如下所示: For i = 2 To finalrow If country = "" Then Sheets("Results").Range("B10:J200000")

我正在编写一个运行数据库搜索的脚本。它是通过一个IF语句来实现的,该语句包含几个条件,这些条件取决于用户在三个不同字段(“国家”、“类别”和“子类别”)中的输入。我以前定义过这些

用户在三个字段中输入的不同组合将产生不同的结果。因此,例如,如果用户未提供“国家”,则搜索将不会运行,并会弹出错误消息,如下所示:

For i = 2 To finalrow

    If country = "" Then
        Sheets("Results").Range("B10:J200000").Clear
        MsgBox "You must select a country in order to search the database. Please do so in the drop-down list provided."
        Sheets("Results").Range("D5").ClearContents
        Sheets("Results").Range("D6").ClearContents
        Sheets("Results").Range("D7").ClearContents
        Exit Sub
ElseIf Sheets("Database").Cells(i, 1) <> country Then
        MsgBox "There is no such country in the database. Please search for information relating to another country."
        Sheets("Results").Range("D5").ClearContents
        Sheets("Results").Range("D6").ClearContents
        Sheets("Results").Range("D7").ClearContents
        Exit Sub
ElseIf (Sheets("Database").Cells(i, 1) = country) And _
        (Sheets("Database").Cells(i, 3) <> category) Then
        MsgBox "There are no records in the database that match your search criteria. Please try another search"
        Sheets("Results").Range("D5").ClearContents
        Sheets("Results").Range("D6").ClearContents
        Sheets("Results").Range("D7").ClearContents
        Exit Sub
For i = 2 To finalrow

If country = "" Then
    Sheets("Results").Range("B10:J200000").Clear
    MsgBox "You must select a country in order to search the database. Please do so in the drop-down list provided."
    Sheets("Results").Range("D5").ClearContents
    Sheets("Results").Range("D6").ClearContents
    Sheets("Results").Range("D7").ClearContents
    Exit Sub

ElseIf Sheets("Database").Cells(i, 1) = country And _
    (Sheets("Database").Cells(i, 3) = category Or category = "") And _
    (Sheets("Database").Cells(i, 4) = subcategory Or subcategory = "") Then

        With Sheets("Database")
        .Range("A1:I1").Copy
        End With
        Sheets("Results").Range("B10:J10").PasteSpecial

        With Sheets("Database")
        .Range(.Cells(i, 1), .Cells(i, 9)).Copy
        End With
        Sheets("Results").Range("B600").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats

    Me.Hide

ElseIf Sheets("Database").Cells(i, 1) <> country Then
    MsgBox "There is no such country in the database. Please search for information relating to another country."
    Sheets("Results").Range("D5").ClearContents
    Sheets("Results").Range("D6").ClearContents
    Sheets("Results").Range("D7").ClearContents
    Exit Sub

ElseIf (Sheets("Database").Cells(i, 1) = country) And _
    (Sheets("Database").Cells(i, 3) <> category) Then
    MsgBox "There are no records in the database that match your search criteria. Please try another search"
    Sheets("Results").Range("D5").ClearContents
    Sheets("Results").Range("D6").ClearContents
    Sheets("Results").Range("D7").ClearContents
    Exit Sub

End If

Next I
如果用户提供了国家/地区,则会运行搜索,根据用户是否提供了类别和子类别,显示或多或少的结果:

ElseIf Sheets("Database").Cells(i, 1) = country And _
        (Sheets("Database").Cells(i, 3) = category Or category = "") And _
        (Sheets("Database").Cells(i, 4) = subcategory Or subcategory = "") Then

            With Sheets("Database")
            .Range("A1:I1").Copy
            End With
            Sheets("Results").Range("B10:J10").PasteSpecial

            With Sheets("Database")
            .Range(.Cells(i, 1), .Cells(i, 9)).Copy
            End With
            Sheets("Results").Range("B600").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats

    End If

Next I
这一切都很好

现在,我想为另外两种情况的IF语句添加更多条件:

1-用户提供数据库中不存在的国家/地区。我写的如下:

For i = 2 To finalrow

    If country = "" Then
        Sheets("Results").Range("B10:J200000").Clear
        MsgBox "You must select a country in order to search the database. Please do so in the drop-down list provided."
        Sheets("Results").Range("D5").ClearContents
        Sheets("Results").Range("D6").ClearContents
        Sheets("Results").Range("D7").ClearContents
        Exit Sub
ElseIf Sheets("Database").Cells(i, 1) <> country Then
        MsgBox "There is no such country in the database. Please search for information relating to another country."
        Sheets("Results").Range("D5").ClearContents
        Sheets("Results").Range("D6").ClearContents
        Sheets("Results").Range("D7").ClearContents
        Exit Sub
ElseIf (Sheets("Database").Cells(i, 1) = country) And _
        (Sheets("Database").Cells(i, 3) <> category) Then
        MsgBox "There are no records in the database that match your search criteria. Please try another search"
        Sheets("Results").Range("D5").ClearContents
        Sheets("Results").Range("D6").ClearContents
        Sheets("Results").Range("D7").ClearContents
        Exit Sub
For i = 2 To finalrow

If country = "" Then
    Sheets("Results").Range("B10:J200000").Clear
    MsgBox "You must select a country in order to search the database. Please do so in the drop-down list provided."
    Sheets("Results").Range("D5").ClearContents
    Sheets("Results").Range("D6").ClearContents
    Sheets("Results").Range("D7").ClearContents
    Exit Sub

ElseIf Sheets("Database").Cells(i, 1) = country And _
    (Sheets("Database").Cells(i, 3) = category Or category = "") And _
    (Sheets("Database").Cells(i, 4) = subcategory Or subcategory = "") Then

        With Sheets("Database")
        .Range("A1:I1").Copy
        End With
        Sheets("Results").Range("B10:J10").PasteSpecial

        With Sheets("Database")
        .Range(.Cells(i, 1), .Cells(i, 9)).Copy
        End With
        Sheets("Results").Range("B600").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats

    Me.Hide

ElseIf Sheets("Database").Cells(i, 1) <> country Then
    MsgBox "There is no such country in the database. Please search for information relating to another country."
    Sheets("Results").Range("D5").ClearContents
    Sheets("Results").Range("D6").ClearContents
    Sheets("Results").Range("D7").ClearContents
    Exit Sub

ElseIf (Sheets("Database").Cells(i, 1) = country) And _
    (Sheets("Database").Cells(i, 3) <> category) Then
    MsgBox "There are no records in the database that match your search criteria. Please try another search"
    Sheets("Results").Range("D5").ClearContents
    Sheets("Results").Range("D6").ClearContents
    Sheets("Results").Range("D7").ClearContents
    Exit Sub

End If

Next I
当我添加两个附加语句时,你知道我可能做错了什么吗?
谢谢您的帮助。

当您只有前两个
If
/
ElseIf
块时,循环将一直运行,直到到达第二个条件计算为
True
的行,并执行第二个块。所有其他时间都没有执行任何操作

当您包括第三个块时,国家(很可能)在第一行中不匹配,因此它将向您提供国家不在数据库中的消息(尽管它实际上只不在当前行中)

我会先使用
.Find
搜索国家/地区,如果没有找到匹配项,则退出,然后进行搜索。理想的方法取决于您的数据(是否有许多预期匹配等)


同样的逻辑也适用于最后一个区块,尽管这只会在发现该国后导致问题,但类别不同。这可能是最简单的搜索,然后检查是否有任何匹配。如果没有,您可以给出消息。

您发起的代码在哪里?似乎这只是一个包含一个国家的刺痛。如果这是正确的,那么您的代码中几乎只允许一个国家:
ElseIf表(“数据库”)。单元格(i,1)=国家和
。因此,
单元格(i,1)
必须准确地包含
国家/地区的内容
,否则
If
语句将不起作用(特别是因为它在逻辑上与
组合)。因此,您将(应该)始终收到
无此类国家/地区的错误消息。我没有将其包括在问题中,因为我认为这会让人困惑。这里是:
country=Sheets(“结果”).Range(“D5”).Value category=Sheets(“结果”).Range(“D6”).Value subcategory=Sheets(“结果”).Range(“D7”).Value finalrow=Sheets(“数据库”).Range(“A200000”).End(xlUp).行
正如我所想的那样。因此,基本上,
country
获取
Sheets(“Results”).Range(“D5”).value
如果此单元格包含
USA
,则您的行
ElseIf Sheets(“Database”).Cells(i,1)=country和
比较
Sheets(“Database”).Cells(i,1)
USA
。如果它们相等,则您的
ElseIf
可以工作(如果满足其他
If
情况)。然而,只有美国才会被接受。以下内容不起作用:
\u USA
USA
USA
USA
,等等。此外,只接受
USA
(无其他国家)。只需添加到上述ArcadeSpecinct的帖子中,在执行
.Find
时,我会在执行
之前立即关闭调试器,并在执行
后立即恢复调试器。Find
-要关闭调试器,请输入
On Error resume Next
并恢复调试器(这一点非常重要!)这是
错误转到0
-这将避免宏crashing@Jeremy在我看来,更好的选择是使用
设置一个范围。找到
并检查它是否为
。因为它只执行一次,所以可能的性能提升是不值得的。