2016-11-18 97 views
2

我正在編寫一個運行數據庫搜索的腳本。它通過一個IF語句來實現,該語句具有多個條件,這些條件取決於三個不同字段(「國家」,「類別」和「子類別」)中的用戶輸入。我之前已經定義了這些。If Excel ElseIF Statement in Excel VBA

由三個字段的用戶的輸入的不同組合會產生不同的結果。因此,舉例來說,如果用戶沒有提供一個「國家」,那麼搜索將無法運行和錯誤信息會彈出如下:

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 

    End If 

Next I 

這是工作的所有細。

我現在想添加更多條件IF語句的另外兩個情況:

1 - 用戶提供不存在於數據庫中的國家。我寫了這個如下:

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 

2:用戶提供一個國家和數據庫的組合,不存在於數據庫中。我寫了這個如下:

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 

正如我所說的,沒有這兩個附加ElseIf語句,腳本運行正常,並從數據庫檢索的結果。然而,當我加入這兩個語句,只從第三If聲明MsgBox(讀「有一個在數據庫中沒有這樣的國家,請搜索與其他國家的信息。」)顯示。

整個代碼,與另外兩個聲明,如下:

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 

你有什麼,我可能是做錯了任何想法時,我添加了兩個額外的語句? 謝謝你的幫助。

+1

你在哪裏啓動'country'的代碼在哪裏?似乎這只是一個包含一個國家的「刺痛」。如果這是正確的,那麼你在代碼中只允許不超過**一個**國家:'ElseIf Sheets(「Database」)。Cells(i,1)= country And _'。因此,'Cells(i,1)'必須包含'country'中的內容,否則'If'語句將不起作用(尤其是因爲它在邏輯上與'AND'結合在一起)。因此,你將(應該)總是得到'沒有這樣的國家'的錯誤信息。 – Ralph

+0

我沒有把它包含在問題中,因爲我認爲這隻會令人困惑。這裏是: 'country =表格(「結果」)。範圍(「D5」)。值 category =表格(「結果」)。範圍(「D6」)。值 子類別=表格(「結果」 ).Range(「D7」)。值 finalrow = Sheets(「Database」)。Range(「A200000」)。End(xlUp).Row' – franciscofcosta

+1

就像我想的那樣。因此,基本上'country'獲得'Sheets(「Results」)的值。Range(「D5」)。Value如果這個單元格包含'USA',那麼你的行'ElseIf Sheets(「Database」)。 ,1)=國家和_'比較'表格(「數據庫」)。單元格(i,1)'到'USA'。如果它們相等,那麼你的'ElseIf'可以工作(如果其他'if'情況得到滿足的話)。然而,只有「美國」纔會被接受。以下將不**工作:'_USA','美國','美國','美國'等。此外,只有'美國'被接受(**否**其他國家)。 – Ralph

回答

2

當您只有兩個第一個塊時,循環會一直運行,直到第二個條件的計算結果爲True並執行第二個塊爲止。所有其他時間都沒有執行。

當您包含第三個塊時,該國(很有可能)不會匹配第一行,因此它會告訴您該國家不在數據庫中的消息(儘管它實際上只不在當前行中)。

我會搜索使用.Find第一和退出,如果沒有匹配的國家,然後進行搜索。理想的方式將取決於你的數據(有很多預期的匹配等)

相同的邏輯適用於最後一個塊,雖然這隻會導致問題,一旦國家被發現,但具有不同的類別。這可能是最簡單的做搜索,並檢查之後是否有任何匹配。如果沒有,你可以給出信息。

+1

並且只是爲了添加到arcadeprecinct的帖子上面,當執行'.Find'時,我會立即關閉調試器並在執行'.Find'後立即恢復調試器 - 要關閉它,請輸入On Error Resume Next和恢復它(這是非常重要的,你這樣做!)它是'On Error GoTo 0' - 這將避免宏崩潰 – Jeremy

+2

@Jeremy Imo更好的選擇將是使用'.Find'設置一個範圍,並檢查它是否' Nothing'。既然它只是在可能的性能提升不值得的時候才被執行。 – arcadeprecinct

+0

@arcadeprecint你是對的 - 更好的選擇! – Jeremy