[英]IF ElseIF statements in Excel VBA
我正在嘗試為基於國家/地區的數據庫搜索編寫腳本。 搜索在一個充滿數據的工作表上進行,該工作表稱為“數據庫”,結果粘貼到另一個工作表中,稱為“結果”。
搜索取決於用戶輸入的變量,我將其定義為“國家/地區”,“類別”和“子類別”:
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
填寫的搜索條件導致不同的情況。 因此:
1-如果用戶搜索數據庫中未包含的國家/地區,則搜索將不會運行,並且會彈出一條消息,提示您這樣做。 我使用.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-如果用戶未提供要搜索的國家/地區名稱,則搜索將不會運行。 我使用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-如果用戶在數據庫中搜索國家/地區,則運行搜索,列出該國家/地區的所有匹配項;或者,如果用戶通過提供“類別”和“子類別”來縮小搜索范圍,則僅列出匹配的那些數據庫條目這三個標准。 我通過與第一個語句分開的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-作為最后一種情況,我希望腳本對用戶提供“國家/地區”,“類別”和/或“子類別”的事件做出反應,但是,盡管數據庫具有該國家/地區的條目,但它沒有在該類別或子類別中有該國家的條目。 在這種情況下,我希望腳本詢問用戶是否要查看所搜索國家/地區的所有信息,而不管“類別”或“子類別”如何。 我試圖通過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到位時,搜索和腳本整體運行良好。 但是,當我在方案4中插入ElseIf
語句的腳本時,出現了問題。 盡管方案1和2繼續工作,但是每當我搜索一個我知道有“類別”和“子類別”條目的國家/地區時,腳本都會提示方案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
好的,我做了什么:
停止了sub的結束並重新調用。
將方案3卡在if msgbox = yes子句中。 當然,這要求我們將類別和子類別重置為空白,我也這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.