Excel VBA中的IF ElseIF语句

我正在尝试编写一个基于国家的数据库search的脚本。 search在名为“数据库”的数据表上运行,并将结果粘贴到名为“结果”的不同表单中。

search取决于用户input的variables,我已经定义为“国家”,“类别”和“子类别”:

country = Sheets("Results").Range("D5").Value Category = Sheets("Results").Range("D6").Value Subcategory = Sheets("Results").Range("D7").Value finalrow = Sheets("Database").Range("A200000").End(xlUp).Row 

我想通过UserForm填入的search条件导致不同的情况。 因此:

1 – 如果用户search数据库中未包含的国家/地区,search将不会运行,并会popup消息。 我使用了一个.Find函数如此:

 With Worksheets("Database") Set c = .Range("A:A").Find(What:=country, After:=.Cells(1, 1), _ LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False) If Not c Is Nothing Then Else MsgBox "Unfortunately, the database does not have any sources for information in " & country & ". Please search for sources in relating to another country." Sheets("Results").Range("D5").ClearContents Sheets("Results").Range("D6").ClearContents Sheets("Results").Range("D7").ClearContents Exit Sub End If End With 

2-如果用户没有提供要search的国家的名称,search将不会运行。 我使用了一个IF语句来做到这一点:

 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 End If 

3 – 如果用户在数据库中search国家,search将运行,列出国家的所有匹配,或者如果用户通过提供“类别”和“子类别”缩小了search范围,则仅列出匹配的数据库条目三个标准。 我通过IF声明与第一个声明分开,

 For i = 2 To finalrow 'If the country field is filled in and there results from the search made If 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 'Copy the headers of the "Database" sheet With Sheets("Database") .Range("A1:I1").Copy End With Sheets("Results").Range("B10:J10").PasteSpecial 'Copy the rows of the "Database" that match the search query With Sheets("Database") .Range(.Cells(i, 1), .Cells(i, 9)).Copy End With Sheets("Results").Range("B20000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats 

4 – 作为最后一种情况,我希望脚本对用户提供“国家”,“类别”和/或“子类别”的事件做出反应,但尽pipe数据库中有该国的条目,在该类别或子类别中具有该国的条目。 在这种情况下,我希望脚本询问用户是否希望查看search国家的所有信息,而不pipe“类别”或“子类别”。 我试图通过IfElse声明,这是前一个IF声明的一部分:

 ElseIf Sheets("Database").Cells(i, 1) = country And _ (Sheets("Database").Cells(i, 3) <> Category) Then Dim question As Integer question = MsgBox("Unfortunately, the Database has no sources regarding " & Category & " in " & country & ". Would you perhaps want to broaden your search and see all sources regarding " & country & "?", vbYesNo + vbQuestion, "No results for your search") Sheets("Results").Range("D6").ClearContents Sheets("Results").Range("D7").ClearContents MsgBox question If question = vbYes Then Close Call SearchButton_Click Exit Sub Else Sheets("Results").Range("D5").ClearContents Sheets("Results").Range("D6").ClearContents Sheets("Results").Range("D7").ClearContents Exit Sub End If 

这是我希望脚本尽可能说明的四种情况。

当只有场景1,2,3时,search和脚本作为一个整体运行良好。 但是,当我在scheme4中插入ElseIf语句的脚本时,出现了一些问题。 尽pipe场景1和场景2继续工作,但是每当我search一个我知道有“类别”和“子类别”条目的国家时,脚本就会提示场景4,就好像没有匹配“国家”,“类别“和”子类别“。

我不确定我可能做错了什么,或者我的ElseIf声明有什么问题。


整个代码

 Private Sub SearchButton_Click() Dim country As String 'Search query category user-inputted Dim Category As String 'Search query category user-inputted Dim Subcategory As String 'Search query category user-inputted Dim finalrow As Integer Dim LastRowForTable As Long 'Last filled row in Results table Dim i As Integer 'row counter Dim ws As Worksheet Set ws = Sheets("Database") 'Erase any entries from the Results sheet Sheets("Results").Range("B10:J200000").ClearContents 'Define the user-inputed variables country = Sheets("Results").Range("D5").Value Category = Sheets("Results").Range("D6").Value Subcategory = Sheets("Results").Range("D7").Value finalrow = Sheets("Database").Range("A200000").End(xlUp).Row 'If statement for search With Worksheets("Database") Set c = .Range("A:A").Find(What:=country, After:=.Cells(1, 1), _ LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False) If Not c Is Nothing Then Else MsgBox "Unfortunately, the database does not have any sources for information in " & country & ". Please search for sources in relating to another country." Sheets("Results").Range("D5").ClearContents Sheets("Results").Range("D6").ClearContents Sheets("Results").Range("D7").ClearContents Exit Sub End If End With 'If the country field is left empty, there is no need to even run a search 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 End If For i = 2 To finalrow 'If the country field is filled in and there results from the search made If 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 'Copy the headers of the "Database" sheet With Sheets("Database") .Range("A1:I1").Copy End With Sheets("Results").Range("B10:J10").PasteSpecial 'Copy the rows of the table that match the search query With Sheets("Database") .Range(.Cells(i, 1), .Cells(i, 9)).Copy End With Sheets("Results").Range("B20000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats ElseIf Sheets("Database").Cells(i, 1) = country And _ (Sheets("Database").Cells(i, 3) <> Category) Then Dim question As Integer question = MsgBox("Unfortunately, the Database has no sources regarding " & Category & " in " & country & ". Would you perhaps want to broaden your search and see all sources regarding " & country & "?", vbYesNo + vbQuestion, "Empty Sheet") Sheets("Results").Range("D6").ClearContents Sheets("Results").Range("D7").ClearContents MsgBox question If question = vbYes Then Close Call SearchButton_Click Exit Sub Else Sheets("Results").Range("D5").ClearContents Sheets("Results").Range("D6").ClearContents Sheets("Results").Range("D7").ClearContents Exit Sub End If End If Next i 'Hides search form Me.Hide 'Toggle Results sheet Sheets("Results").Activate End Sub 

 Private Sub SearchButton_Click() Dim country As String 'Search query category user-inputted Dim Category As String 'Search query category user-inputted Dim Subcategory As String 'Search query category user-inputted Dim finalrow As Integer Dim LastRowForTable As Long 'Last filled row in Results table Dim i As Integer 'row counter Dim ws As Worksheet Set ws = Sheets("Database") 'Erase any entries from the Results sheet Sheets("Results").Range("B10:J200000").ClearContents 'Define the user-inputed variables country = Sheets("Results").Range("D5").Value Category = Sheets("Results").Range("D6").Value Subcategory = Sheets("Results").Range("D7").Value finalrow = Sheets("Database").Range("A200000").End(xlUp).Row 'If statement for search With Worksheets("Database") Set c = .Range("A:A").Find(What:=country, After:=.Cells(1, 1), _ LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False) If Not c Is Nothing Then Else MsgBox "Unfortunately, the database does not have any sources for information in " & country & ". Please search for sources in relating to another country." Sheets("Results").Range("D5").ClearContents Sheets("Results").Range("D6").ClearContents Sheets("Results").Range("D7").ClearContents Exit Sub End If End With 'If the country field is left empty, there is no need to even run a search 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 End If For i = 2 To finalrow 'If the country field is filled in and there results from the search made If 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 'Copy the headers of the "Database" sheet With Sheets("Database") .Range("A1:I1").Copy End With Sheets("Results").Range("B10:J10").PasteSpecial 'Copy the rows of the table that match the search query With Sheets("Database") .Range(.Cells(i, 1), .Cells(i, 9)).Copy End With Sheets("Results").Range("B20000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats ElseIf Sheets("Database").Cells(i, 1) = country And _ (Sheets("Database").Cells(i, 3) <> Category) Then Dim question As Integer question = MsgBox("Unfortunately, the Database has no sources regarding " & Category & " in " & country & ". Would you perhaps want to broaden your search and see all sources regarding " & country & "?", vbYesNo + vbQuestion, "Empty Sheet") MsgBox question If question = vbYes Then Sheets("Results").Range("D6").ClearContents Sheets("Results").Range("D7").ClearContents Category = Sheets("Results").Range("D6").Value Subcategory = Sheets("Results").Range("D7").Value If 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 'Copy the headers of the "Database" sheet With Sheets("Database") .Range("A1:I1").Copy End With Sheets("Results").Range("B10:J10").PasteSpecial 'Copy the rows of the "Database" that match the search query With Sheets("Database") .Range(.Cells(i, 1), .Cells(i, 9)).Copy End With Sheets("Results").Range("B20000").End(xlUp).Offset(1, 0).PasteSpecial xlPasteFormulasAndNumberFormats End If Else Sheets("Results").Range("D5").ClearContents Sheets("Results").Range("D6").ClearContents Sheets("Results").Range("D7").ClearContents Exit Sub End If End If Next i 'Hides search form Me.Hide 'Toggle Results sheet Sheets("Results").Activate End Sub 

好的我做了什么:

停止子的结束和回忆。

如果msgbox = yes子句中出现scheme3。 这当然要求我们将类别和子类别重置为空白,我也这样做了。