VBA中嵌套的If…Then語(yǔ)句和Select Case語(yǔ)句

2021-12-08 14:28 更新

將一個(gè)If…Then語(yǔ)句或If…Then…Else語(yǔ)句放在另外一個(gè)If…Then語(yǔ)句或If…Then…Else語(yǔ)句里面,你可以在你的VBA過程里作出更復(fù)雜的決定。這種一個(gè)If語(yǔ)句里包含另一個(gè)If指令塊的結(jié)構(gòu)稱為嵌套的If語(yǔ)句。接下來的過程TestConditions是上節(jié)里的過程WhatValue的修正版,演示嵌套的If…Then語(yǔ)句是如何工作的:

Sub TestConditions()
 Range("A1").Select
 If IsEmpty(ActiveCell) Then
    MsgBox "The cell is empty."
 Else
      If IsNumeric(ActiveCell.Value) Then
         If ActiveCell.Value = 0 Then
                ActiveCell.Offset(0, 1).Value ="zero"
         ElseIf ActiveCell.Value > 0 Then
                ActiveCell.Offset(0, 1).Value ="positive"
         ElseIf ActiveCell.Value < 0 Then
                ActiveCell.Offset(0, 1).Value ="negative"
         End If
       Else
         ActiveCell.Offset(0, 1).Value = "text"
       End If
  End If
End Sub

為了使過程TestConditions更容易理解,每個(gè)If…Then語(yǔ)句都顯示為不同的格式,現(xiàn)在你可以清楚地看到過程使用了三個(gè)If…Then程序塊。


第一個(gè)If塊(粗體)檢查當(dāng)前單元格是否為空,如果為真,就會(huì)顯示信息,然后VB將跳過Else部分找到相應(yīng)的End If,該語(yǔ)句位于關(guān)鍵字End Sub之前。


如果當(dāng)前單元格不為空,IsEmpty(ActiveCell)條件返回假,并且VB運(yùn)行粗體Else下面的單下劃線的If塊。該單下劃線的If…Then…Else語(yǔ)句就是嵌套在第一個(gè)If塊(粗體)的。該語(yǔ)句檢查當(dāng)前單元格是否是個(gè)數(shù)字。注意,我們通過另一個(gè)內(nèi)置函數(shù)IsNumeric來做這個(gè)。如果當(dāng)前單元格的值不是一個(gè)數(shù)字,條件就為假,因此,VB跳到單下劃線的Else處,并且在B1里輸入“text”。然而,如果當(dāng)前單元格包含個(gè)數(shù)字時(shí),VB就會(huì)運(yùn)行雙下劃線的If塊,評(píng)估每種情況并作出相應(yīng)的決定。


第一個(gè)If塊(粗體)被稱為外部If語(yǔ)句,這個(gè)外部語(yǔ)句包含兩個(gè)內(nèi)部的If語(yǔ)句(單下劃線和雙下劃線)。

技巧:嵌套語(yǔ)句
嵌套是指將一種控制結(jié)構(gòu)放在另外一控制結(jié)構(gòu)里面。你將在后面的循環(huán)結(jié)構(gòu)里看到更多的嵌套的例子。 

Select Case語(yǔ)句

為了避免難以弄清的復(fù)雜的嵌套的If語(yǔ)句,你可以使用Select Case語(yǔ)句代替。它的語(yǔ)法為:
Select Case 測(cè)試表達(dá)式
Case 表達(dá)式1
如果表達(dá)式1匹配測(cè)試表達(dá)式的語(yǔ)句
Case 表達(dá)式2
如果表達(dá)式2匹配測(cè)試表達(dá)式的語(yǔ)句
Case 表達(dá)式N
如果表達(dá)式N匹配測(cè)試表達(dá)式的語(yǔ)句
Case Else
如果沒有表達(dá)式匹配測(cè)試表達(dá)式要執(zhí)行的語(yǔ)句
End Select
你在關(guān)鍵字Select Case和End Select之間放置任意多個(gè)條件以測(cè)試。子句Case Else是可選的,當(dāng)你希望可能有條件表達(dá)式返回假時(shí)使用它。在Select Case語(yǔ)句里,VB將每個(gè)表達(dá)式和測(cè)試表達(dá)式相比較。

這里是Select Case語(yǔ)句背后的邏輯。當(dāng)VB遇到Select Case子句,它記下測(cè)試表達(dá)式的值。然后它前進(jìn)到下面的第一個(gè)Case子句,如果這個(gè)表達(dá)式的值和測(cè)試表達(dá)式的值匹配的話,VB就會(huì)執(zhí)行語(yǔ)句直到遇到另外一個(gè)Case子句并且跳到EndSelect語(yǔ)句。然而,如果第一個(gè)Case子句后面的表達(dá)式測(cè)試結(jié)果和測(cè)試表達(dá)式不匹配時(shí),VB就會(huì)檢查每一個(gè)Case子句,直到它找到一個(gè)匹配的為止。如果沒有一個(gè)Case子句后面的表達(dá)式匹配測(cè)試表達(dá)式的值的話,VB就會(huì)跳到Case Else子句并執(zhí)行該語(yǔ)句直到遇到關(guān)鍵字EndSelect。注意,CaseElse子句是可選的,如果你的程序里面沒有使用CaseElse并且沒有一個(gè)Case子句的表達(dá)式和測(cè)試表達(dá)式相匹配,VB就會(huì)跳到EndSelect后面的語(yǔ)句,并且繼續(xù)執(zhí)行你的程序。

我們來一個(gè)使用Select Case語(yǔ)句的程序例子。在第四章里,你學(xué)習(xí)了MsgBox函數(shù)允許你顯示帶有一個(gè)或多個(gè)按鈕的信息,你也學(xué)習(xí)了MsgBox函數(shù)的結(jié)果可以賦予一個(gè)變量。使用SelectCase語(yǔ)句,你現(xiàn)在可以基于用戶按下的按鈕決定采取哪個(gè)行動(dòng)。

1.  在當(dāng)前工程里插入一新模塊

2.  重命名新模塊SelectCase.

3.  輸入下述過程TestButtons:
Sub TestButtons()
    Dim question As String
    Dim bts As Integer
    Dim myTitle As String
    Dim myButton As Integer
    question = "Do you want to open a new workbook?"
    bts = vbYesNoCancel + vbQuestion + vbDefaultButton1
    myTitle = "New Workbook"
    myButton = MsgBox(prompt:=question, buttons:=bts, _ title:=myTitle)
    Select Case myButton
         Case 6
                  Workbooks.Add
         Case 7
                  MsgBox "You can open a new book manually later."
         Case Else
                  MsgBox "You pressed Cancel."
         End Select
    End Sub
過程TestButtons的第一部分顯示一個(gè)帶有三個(gè)按鈕的信息框:是,否和取消。用戶選擇按鈕的值賦予變量myButton。
如果用戶點(diǎn)擊“是”,那么變量myButton就會(huì)被賦值常量vbYes或它對(duì)應(yīng)的值6;如果用戶點(diǎn)擊“否”,那么變量myButton則賦值為常量vbNo或它對(duì)應(yīng)的值7;最后,如果點(diǎn)擊了“取消”,變量myButton的內(nèi)容就等于vbCancel或2。

Select Case語(yǔ)句對(duì)照儲(chǔ)存在變量myButton里的值檢查Case子句提供的值。當(dāng)有匹配時(shí),就會(huì)執(zhí)行適當(dāng)?shù)腃ase語(yǔ)句。如果你使用常量,而不是按鈕值,過程TestButtons同樣會(huì)運(yùn)行一致。
Select Case myButton
    Case vbYes
             Workbooks.Add
    Case vbNo
             MsgBox "You can open a new book manually later."
    Case Else
             MsgBox "You pressed Cancel."
End Select
你可以忽略Else子句,可以按下述方法修改一下Select Case語(yǔ)句:
Select Case myButton
    Case vbYes
             Workbooks.Add
    Case vbNo
             MsgBox "You can open a new book manually later."
    Case vbCancel
             MsgBox "You pressed Cancel."
End Select
4.  運(yùn)行過程TestButtons三次,每次選擇一個(gè)不同的按鈕。

技巧:通過Case Else捕捉錯(cuò)誤
盡管在Select Case語(yǔ)句里使用Case Else不是強(qiáng)制的,使用它總是很好的,以防止萬一測(cè)試有沒有預(yù)料到的值。Case Else子句是個(gè)放置錯(cuò)誤信息的好地方。



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)