国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
第7章 程序控制結(jié)構(gòu)
第7章 程序控制結(jié)構(gòu)
 
  程序代碼需要按一定的順序執(zhí)行,有時(shí)需要選擇某一部分代碼執(zhí)行;有時(shí)需要反復(fù)執(zhí)行某一段代碼。通過(guò)程序結(jié)構(gòu)控制代碼可以完成這些功能。
  7.1 算法的概念及表示
  對(duì)于稍微復(fù)雜一點(diǎn)的應(yīng)用程序,在開始編寫代碼之前,應(yīng)該先設(shè)計(jì)其算法。本節(jié)首先簡(jiǎn)單地介紹一下算法和流程圖方面的知識(shí)。
  7.1.1 算法簡(jiǎn)介
  使用計(jì)算機(jī)處理各種不同的問(wèn)題時(shí),必須事先對(duì)各類問(wèn)題進(jìn)行分析,確定解決問(wèn)題的具體方法和步驟,再編寫好一組讓計(jì)算機(jī)執(zhí)行的代碼,交給計(jì)算機(jī),讓計(jì)算機(jī)按設(shè)計(jì)好的步驟進(jìn)行工作。這些具體的方法和步驟其實(shí)就是解決一個(gè)問(wèn)題的算法。根據(jù)算法,選擇一種程序設(shè)計(jì)語(yǔ)言編寫完成任務(wù)的代碼,也就是編制程序。一個(gè)算法應(yīng)該具有以下5個(gè)重要的特征。
 ?。?、有窮性,一個(gè)算法必須保證執(zhí)行有限步之后結(jié)束。
  b、確切性,算法的每一步驟必須有確切的定義。
  c、輸入,一個(gè)算法有一個(gè)或多個(gè)輸出,以反映對(duì)輸入數(shù)據(jù)加工后的結(jié)果。算法是毫無(wú)意義的。
  d、可行性,算法原則上能夠精確地運(yùn)行,而且人們用筆和紙做有限次運(yùn)算后也可完成。
  例如下面設(shè)計(jì)求三個(gè)數(shù)中最大數(shù)的算法。
  首先,定義三個(gè)A,B,C用來(lái)保存三個(gè)數(shù),再定義一個(gè)變量MAX用來(lái)保存最大數(shù)。其算法如下:
 ?。保┹斎肴齻€(gè)數(shù)分別保存到A,B,C中。
 ?。玻⒆兞浚僚cB進(jìn)行比較,如果A大于B,則將A的值存入變量MAX中;否則將變量B的值存入變量MAX中。
 ?。常⒆兞浚门cMAX進(jìn)行比較,如果C大于MAX,則將C的值存入變量MAX中。
 ?。矗┹敵鲎畲髷?shù)MAX的值。
  使用相應(yīng)的程序設(shè)計(jì)語(yǔ)言將以上步驟進(jìn)行編碼后,即可交給計(jì)算機(jī)進(jìn)行運(yùn)算處理了。
  7.1.2 流程圖
  一般情況下,使用應(yīng)用程序解決的問(wèn)題都比較復(fù)雜,故大家喜歡用一種框圖來(lái)描述算法,這樣就可以把解決問(wèn)題的思路更加清晰、形象、直觀地表現(xiàn)出來(lái),為下一步的程序編制打下基礎(chǔ)。使用圖形表示算法的思路是一種極好的方法,因?yàn)榍а匀f(wàn)語(yǔ)不如一張圖。常用的流程圖符號(hào)如圖7-1所示。
       
  使用流程圖描述上例的算法如圖7-2所示。
  
  由圖7-2可以看出,使用流程圖比用文字描述算法更清晰明了。
  7.2 程序結(jié)構(gòu)概述
  結(jié)構(gòu)化程序設(shè)計(jì)的基本控制結(jié)構(gòu)有三種:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。
 ?。?、順序結(jié)構(gòu):就是按照語(yǔ)句的書寫順序從上到下、逐條語(yǔ)句地執(zhí)行。執(zhí)行時(shí),排在前面的代碼先執(zhí)行,排在后面的代碼后執(zhí)行,執(zhí)行過(guò)程中沒(méi)有任何分支。順序結(jié)構(gòu)是最普遍的結(jié)構(gòu)形式,也是后面兩種結(jié)構(gòu)的基礎(chǔ)。
 ?。狻⑦x擇結(jié)構(gòu):又叫分支結(jié)構(gòu)。是根據(jù)“條件”來(lái)選擇執(zhí)行哪一分支中的語(yǔ)句。包括二分支和多分支,以及分支的嵌套。
 ?。恪⒀h(huán)結(jié)構(gòu):循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)比分支結(jié)構(gòu)復(fù)雜。循環(huán)結(jié)構(gòu)的思想是利用計(jì)算機(jī)高速處理運(yùn)算的特性,重復(fù)執(zhí)行某一部分代碼,以完成大量有規(guī)則的重復(fù)運(yùn)算。
  7.3 分支程序結(jié)構(gòu)
  在日常生活中,常常需要對(duì)給定的條件進(jìn)行分析、比較和判斷,并根據(jù)判斷結(jié)果采取不同的操作。在VBA的程序中對(duì)這種情況可通過(guò)分支結(jié)構(gòu)程序來(lái)解決。利用分支結(jié)構(gòu)使VBA能對(duì)數(shù)據(jù)進(jìn)行判斷,然后選擇需要的分支進(jìn)行處理,從而使系統(tǒng)具有了智能功能。
  7.3.1 If……Then語(yǔ)句
  要在VBA中做出判斷,最簡(jiǎn)單的方法是使用“If……Then”語(yǔ)句。用“If……Then”結(jié)構(gòu)有條件地執(zhí)行一個(gè)或多個(gè)語(yǔ)句有兩種語(yǔ)法形式。
  1.單行結(jié)構(gòu)條件語(yǔ)句                                                    
  單行結(jié)構(gòu)條件語(yǔ)句是最基本的條件語(yǔ)句,其語(yǔ)法為:                                                                               
  If 邏輯表達(dá)式 Then 語(yǔ)句                                                   
   邏輯表達(dá)式也可以是任何計(jì)算數(shù)值的表達(dá)式,VBA將這個(gè)值解釋為True或False: 為零的數(shù)值為False,而任何非零數(shù)值都被看作True。                                                                      
  該語(yǔ)句的功能為:若邏輯表達(dá)式的值是Ture,則執(zhí)行Then后的語(yǔ)句;若邏輯表達(dá)式的值是False,則不執(zhí)行Then后的語(yǔ)句,而執(zhí)行下一條語(yǔ)句。其流程圖如圖7-3所示。
                         
 
  例如,要?jiǎng)h除工作表中的空行,首先檢查當(dāng)前單元格是否為空,如果為空,則刪除當(dāng)前單元格所在的行。
  If ActiveCell = "" Then Selection.EntireRow.Delete
  執(zhí)行以上語(yǔ)句分兩種情況:第一種情況是活動(dòng)單元格為空,則執(zhí)行Then后面的語(yǔ)句并刪除當(dāng)前行,然后執(zhí)行If語(yǔ)句后面的語(yǔ)句;第二種情況是活動(dòng)單元格不為空,則不執(zhí)行Then后面的語(yǔ)句,而直接執(zhí)行If語(yǔ)句后面的語(yǔ)句。
  2.塊結(jié)構(gòu)條件語(yǔ)句                
  在“If……Then”語(yǔ)句中,如果條件成立時(shí)需要執(zhí)行多個(gè)操作,可將多個(gè)語(yǔ)句寫在Then后面,并用冒號(hào)(:)分隔。“If……Then”語(yǔ)句還提供另外一種塊結(jié)構(gòu)的方法,可使執(zhí)行多行代碼的過(guò)程更清晰,其語(yǔ)法如下:
  If 邏輯表達(dá)式 Then
    語(yǔ)句1
    語(yǔ)句2
    ……
  End If
  塊結(jié)構(gòu)條件語(yǔ)句的作用與單行結(jié)構(gòu)條件語(yǔ)句的功能相同。要注意的是“If……Then”的單行格式不用“End If”語(yǔ)句,而塊語(yǔ)句則必須在條件語(yǔ)句的結(jié)束處有“End If”。例如,如果當(dāng)前工作表名稱為“基礎(chǔ)資料”,則向其中添加表頭數(shù)據(jù):
  If ActiveSheet.Name = "基礎(chǔ)資料" Then
            Range("A1") = "姓名"
   Range("B1") = "性別"
   Range("C1") = "住址" 
       End If 
  7.3.2 If……Then……Else語(yǔ)句
  在“If……Then”語(yǔ)句中,當(dāng)條件為False時(shí),不執(zhí)行任何語(yǔ)句。若要求在條件為False時(shí)執(zhí)行另一段代碼,可用“If……Then……Else”語(yǔ)句完成。“If……Then……Else”語(yǔ)句也有兩種格式:?jiǎn)涡泻投嘈?。單行的格式為?/div>
  If 邏輯表達(dá)式 Then 語(yǔ)句1 Else 語(yǔ)句2
  當(dāng)“邏輯表達(dá)式”的值為True時(shí),執(zhí)行關(guān)鍵字Then后面的“語(yǔ)句1”;當(dāng)“邏輯表達(dá)式”的值為False時(shí),執(zhí)行關(guān)鍵字Else后面的“語(yǔ)句2”。
  多行條件語(yǔ)句將根據(jù)條件表達(dá)式的值來(lái)判斷并執(zhí)行其中一個(gè)語(yǔ)句塊。語(yǔ)法格式如下:
  If 邏輯表達(dá)式 Then
    語(yǔ)句序列1
  Else
    語(yǔ)句序列2
  End If
 ?。郑拢僚袛?#8220;邏輯表達(dá)式”的值如果為True,執(zhí)行“語(yǔ)句序列1”中的各條語(yǔ)句;如果“邏輯表達(dá)式”的值為False時(shí),就執(zhí)行“語(yǔ)句序列2”中的各條語(yǔ)句。其流程圖如圖7-4所示。
   
  例如,下面的程序用于判斷單元格“A1”的值:如果為空,則在該單元格中寫入數(shù)據(jù)“10”,否則將單元格中的值增加10。
  If IsEmpty(Range("A1")) Then
            Range("A1") = 10
        Else
            Range("A1") = Range("A1") + 10
        End If
  7.3.3  IIf函數(shù)
  IIf函數(shù)可用來(lái)執(zhí)行簡(jiǎn)單的條件判斷操作,它是“If……Then……Else”結(jié)構(gòu)的簡(jiǎn)寫版本,其語(yǔ)法格式如下:
  .result=IIf(邏輯條件表達(dá)式,true部分,false部分)
  變量result保存函數(shù)的返回值。“邏輯條件表達(dá)式”為判斷的條件,當(dāng)條件為True時(shí),IIf函數(shù)返回“true部分”;當(dāng)條件為False時(shí),IIf函數(shù)返回“false部分”。
  例如,有以下的If……Then……Else語(yǔ)句:
  If?。幔?0 Then
               b = 1
       Else
              b = 2
       End If
  可改寫為IIF函數(shù)樣式:
  b = IIf(a > 10, 1, 2)
  技巧:“true部分”和“false部分”可以是表達(dá)式、變量或其他IIf函數(shù)。
  7.3.4 If……Then……ElseIf語(yǔ)句
  在很多情況下,可能需要判斷幾個(gè)不同的條件,并根據(jù)不同條件執(zhí)行不同的語(yǔ)句。這時(shí)可使用“If……Then……ElseIf”語(yǔ)句來(lái)對(duì)多個(gè)不同條件進(jìn)行判斷,并在多個(gè)語(yǔ)句塊中選擇執(zhí)行其中的一個(gè),其語(yǔ)法格式如下:
  If 邏輯表達(dá)式1 Then
    語(yǔ)句序列1
  ElseIf 邏輯表達(dá)式2 Then
    語(yǔ)句序列2
  ElseIf 邏輯表達(dá)式3 Then
    語(yǔ)句序列3
    ……
  Else
    語(yǔ)句序列n
  End If
  在以上結(jié)構(gòu)中,可以包括任意數(shù)量的ElseIf子句和條件,ElseIf子句總是出現(xiàn)在Else子句之前。
  VBA首先判斷“邏輯表達(dá)式1”的值。如果它為False,再判斷“邏輯表達(dá)式2”的值,以此類推,當(dāng)找到一個(gè)為True的條件,就會(huì)執(zhí)行相應(yīng)的語(yǔ)句塊,然后執(zhí)行End If后面的代碼。如果所有“邏輯表達(dá)式”都為False,且包含Else語(yǔ)句塊,則執(zhí)行Else語(yǔ)句塊。其流程圖如圖7-5所示。
   
  例如,用以下代碼對(duì)企業(yè)員工職務(wù)進(jìn)行判斷,根據(jù)不同的職務(wù)返回不同的職務(wù)工資標(biāo)準(zhǔn):
  If Range("職務(wù)")="總經(jīng)理" Then
    curPay = 1000
  ElseIf  Range("職務(wù)") = "副總經(jīng)理"  Then
    curPay = 900
  ElseIf  Range("職務(wù)") = "廠長(zhǎng)"  Then
    curPay = 800
  ElseIf  Range("職務(wù)") = "副廠長(zhǎng)"  Then
    curPay = 700
  ElseIf  Range("職務(wù)") = "部門主任"  Then
    curPay = 500
  Else
    curPay = 0
  End If
  7.3.5 Select Case語(yǔ)句
  在“If……Then”分支語(yǔ)句中,問(wèn)題可以添加更多的ElseIf塊,但是,當(dāng)每個(gè)ElseIf塊都將相同的表達(dá)式與不同的數(shù)值比較時(shí),這個(gè)結(jié)構(gòu)編寫起來(lái)很乏味,也不易閱讀。在這種情況下可以用多分支選擇結(jié)構(gòu)“Select Case”語(yǔ)句。
  “Select Case”語(yǔ)句的功能與“If……Then……Else”語(yǔ)句類似,但對(duì)多重選擇的情況,“Select Case”語(yǔ)句可使代碼更加易讀。
  “Select Case”在結(jié)構(gòu)的開始處理一個(gè)測(cè)試表達(dá)式并只計(jì)算一次,然后,VBA將表達(dá)式的值與結(jié)構(gòu)中的每個(gè)Case的值進(jìn)行比較,如果相等,就執(zhí)行與該Case相關(guān)聯(lián)的語(yǔ)句塊,執(zhí)行完畢再跳轉(zhuǎn)到End Select語(yǔ)句后執(zhí)行。其語(yǔ)法格式如下:
  Select Case 測(cè)試表達(dá)式
   Case 表達(dá)式列表1
     語(yǔ)句序列1
   Case 表達(dá)式列表2
     語(yǔ)句序列2
     ……
   Case Else
     語(yǔ)句序列n
   End Select
  其中“測(cè)試表達(dá)式”可以是數(shù)值型或字符型的表達(dá)式,通常是一個(gè)數(shù)值型或字符型的變量。表達(dá)式列表可以是一個(gè)或幾個(gè)值的列表。如果在一個(gè)列表中有多個(gè)值,就用逗號(hào)將各個(gè)值分隔開。每一個(gè)語(yǔ)句序列中含零個(gè)或多個(gè)語(yǔ)句。如果不止一個(gè)Case與測(cè)試表達(dá)式相匹配,則只對(duì)第一個(gè)匹配的Case執(zhí)行與之相關(guān)聯(lián)的語(yǔ)句塊vkjs如果表達(dá)式列表中沒(méi)有一個(gè)值與測(cè)試表達(dá)式相匹配,則VBA執(zhí)行Case Else子句(此項(xiàng)可選)中的語(yǔ)句。其流程圖如圖7-6所示。表達(dá)式列表可以按以下幾種情況進(jìn)行書寫。
  表達(dá)式:這種方式用來(lái)表達(dá)一些具體的取值。例如,Case1,3,5。
  表達(dá)式 A To表達(dá)式B:這種方式用來(lái)表示一個(gè)數(shù)據(jù)范圍。例如,Case 1 To 10。
  Is比較運(yùn)算符表達(dá)式。例如,Case Is<60表示所有小于60的值。
  以上三種情況的混合。例如,Case 0 To 60,80,Is>90
    
  注意:Select Case結(jié)構(gòu)每次都要在開始處計(jì)算表達(dá)式的值;If……Then……Else結(jié)構(gòu)為每個(gè)ElseIf語(yǔ)句計(jì)算不同的表達(dá)式。只有當(dāng)If語(yǔ)句和每一個(gè)ElseIf語(yǔ)句計(jì)算的表達(dá)式相同時(shí),才能用Select Case結(jié)構(gòu)替換If……Then……Else結(jié)構(gòu)。
  例如,將上例中使用“If……Then……ElseIf”語(yǔ)句編寫的程序改寫為以下形式:
  Select Case Range("職務(wù)")
   Case?。⒖偨?jīng)理"
    curPay = 1000
   Case?。⒏笨偨?jīng)理"
    curPay = 900
   Case?。S長(zhǎng)"
    curPay = 800
   Case?。⒏睆S長(zhǎng)"
    curPay = 700
   Case?。⒉块T主任"
    curPay = 500
   Case Else
    curPay = 0
  End Select
  在Select Case語(yǔ)句中,可以使用Is關(guān)鍵字后面加上比較運(yùn)算符來(lái)對(duì)某一個(gè)區(qū)間進(jìn)行判斷。例如用以下代碼計(jì)算個(gè)人所得稅,其中個(gè)人所得稅的稅率如圖7-7所示。
  
  Function 計(jì)算個(gè)人所得稅(curPay As Currency)
    Dim curTemp As Currency
                Dim CurPay1 As Currency
    curPay1 = curPay - 1600
    Select Case curPay
     Case Is <= 500
       curTemp = curPay1*0.05
     Case Is <= 2000
       curTemp = (curPay1-500)*0.1+25
     Case Is <= 5000
       curTemp = (curPay1-2000)*0.15+125
     Case Is <= 20000
       curTemp = (curPay1-5000)*0.2+375
     Case Is <= 40000
       curTemp = (curPay1-20000)*0.25+1375
     Case Is <60000
       curTemp = (curPay1-40000)*0.3+3375
     Case Is <80000
       curTemp = (curPay1-60000)*0.35+6375 
     Case Is <100000
       curTemp = (curPay1-60000)*0.4+10375 
     Case Else
       curTemp = (curPay1-100000)*0.45+15375
     End Select
     計(jì)算個(gè)人所得稅 = curTemp
  End Function
  在使用Is關(guān)鍵字進(jìn)行條件判斷時(shí),條件的先后順序很重要。如本例中,若將Is<100000寫在第一個(gè)條件位置,程序運(yùn)行將得不到正確的結(jié)果。
  7.3.6 分支結(jié)構(gòu)的嵌套
   在一個(gè)分支結(jié)構(gòu)語(yǔ)句中還可以包含另一個(gè)分支結(jié)構(gòu)語(yǔ)句,這稱為嵌套。例如,以下程序用于判斷當(dāng)前單元格中保存值的類型:
  Sub 判斷當(dāng)前單元格數(shù)據(jù)類型()
    If IsEmpty(ActiveCell) Then                 '單元格為空
      MsgBox "當(dāng)前單元格為空,請(qǐng)輸入數(shù)據(jù)后再執(zhí)行本程序?。ⅰ?/div>
     Else                             '單元格不為空
     If IsNumeric(ActiveCell.Value) Then             '單元格為數(shù)值
       If ActiveCell.Value?。健? Then              '數(shù)據(jù)為零
                                 ActiveCell.offset(0,1).Value = "零"
       ElseIf ActiveCell.Value?。尽? Then                        '數(shù)據(jù)為正數(shù)
        ActiveCell.offset(0,1).Value = "正數(shù)"
       Else                           '數(shù)據(jù)為負(fù)數(shù)
        ActiveCell.offset(0,1).Value = "負(fù)數(shù)"
       End If
     Else                             '數(shù)據(jù)不為數(shù)值,則為文本
       ActiveCell.offset(0,1).Validation = "文本"
                           End If
                      End If
  End Sub
  這段代碼使用了If語(yǔ)句的嵌套結(jié)構(gòu),嵌套的層次最多為三層。程序代碼的功能在代碼后面的注釋中都進(jìn)行了說(shuō)明,其流程圖如圖7-8所示。
   
  注意:在塊If語(yǔ)句的嵌套中,每一個(gè)If語(yǔ)句都需要一個(gè)End If語(yǔ)句與之對(duì)應(yīng),在輸入代碼時(shí)最好采用縮進(jìn)結(jié)構(gòu),以便于看清楚嵌套的層次,防止少寫End If語(yǔ)句。
  7.4 循環(huán)程序結(jié)構(gòu)
  前面介紹了使用分支結(jié)構(gòu)讓VBA程序具有判斷能力,從而使程序?qū)崿F(xiàn)一定的智能化。但是這種分支結(jié)構(gòu)的程序都是從代碼的開始處按順序執(zhí)行,只是路途跳過(guò)一些語(yǔ)句不執(zhí)行。
  在實(shí)際需要中,有時(shí)還需要反復(fù)操作某一個(gè)或幾個(gè)動(dòng)作。如果將這種操作編寫成VBA代碼來(lái)完成,則表示程序運(yùn)行到一個(gè)位置后,又返回前面的代碼來(lái)進(jìn)行操作,這種結(jié)構(gòu)稱為循環(huán)結(jié)構(gòu)。VBA中提供了多種循環(huán)結(jié)構(gòu)控制語(yǔ)句。
  7.4.1 Do……Loop循環(huán)
  用Do循環(huán)重復(fù)執(zhí)行一語(yǔ)句塊,且重復(fù)次數(shù)不定。“Do……Loop”語(yǔ)句有4種演變形式,但每種都需要計(jì)算條件表達(dá)式的值,以決定是否繼續(xù)執(zhí)行。在Do循環(huán)中可以使用“Exit Do”語(yǔ)句中途退出該循環(huán)。
  1. Do While……Loop循環(huán)
  “Do While”語(yǔ)句屬于先測(cè)試循環(huán)條件的“Do……Loop”語(yǔ)句,其語(yǔ)法格式如下:
  Do While 邏輯表達(dá)式
    語(yǔ)句序列1
    [Exit Do]
   ?。壅Z(yǔ)句序列2]
  Loop
  其中Do While和Loop都是關(guān)鍵字,在Do While和Loop之間的語(yǔ)句稱為循環(huán)體。
  當(dāng)VBA執(zhí)行這個(gè)Do循環(huán)時(shí),首先判斷邏輯表達(dá)式:如果為False(或零),則跳過(guò)所有語(yǔ)句,執(zhí)行Loop的下一條語(yǔ)句:如果為True(或非零),則執(zhí)行循環(huán)體,當(dāng)執(zhí)行到Loop語(yǔ)句后,又跳回到Do While語(yǔ)句再次判斷條件。在循環(huán)體中如果包含有Exit Do語(yǔ)句,當(dāng)執(zhí)行到Exit Do語(yǔ)句,馬上跳出循環(huán),執(zhí)行Loop的下一條語(yǔ)句。其流程圖如圖7-9所示。
    
 
  這種形式的循環(huán)體可能執(zhí)行零次或多次。只要條件表達(dá)式為True或非零,循環(huán)就會(huì)重復(fù)執(zhí)行。如果邏輯表達(dá)式最初就為False,則不會(huì)執(zhí)行循環(huán)語(yǔ)句。
  2. Do……Loop While循環(huán)
   “Do……Loop While”語(yǔ)句屬于后測(cè)試循環(huán)條件的“Do……Loop”語(yǔ)句,該結(jié)構(gòu)先執(zhí)行循環(huán)體中的語(yǔ)句,然后再進(jìn)行條件判斷。這種形式的循環(huán)體至少執(zhí)行一次,其語(yǔ)法格式如下:
  Do
   語(yǔ)句序列1
  ?。跡xit Do]
  ?。壅Z(yǔ)句序列2]
  Loop While 邏輯表達(dá)式
  其流程圖7-10所示。
  3. Do Until……Loop循環(huán)
  該語(yǔ)句為先測(cè)試結(jié)束條件的“Do……Loop”語(yǔ)句,其語(yǔ)法形式如下:
  Do Until 邏輯表達(dá)式
    語(yǔ)句序列1
    [Exit Do]
   ?。壅Z(yǔ)句序列2]
  Loop
  這種形式與“Do While……Loop”類似,不同的是當(dāng)邏輯表達(dá)式的值為False時(shí)才執(zhí)行循環(huán)體,否則退出循環(huán)。這種形式的循環(huán)體可能執(zhí)行零次或多次。
  4.Do……Loop Until循環(huán)
   這是后測(cè)試結(jié)束條件的“Do……Loop”語(yǔ)句,其語(yǔ)法形式如下:
  Do
   語(yǔ)句序列1
  ?。跡xit Do]
  ?。壅Z(yǔ)句序列2]
  Loop Until 邏輯表達(dá)式
  這種形式與“Do……Loop While”類似,不同的是當(dāng)邏輯表達(dá)式的值為False時(shí)才執(zhí)行循環(huán)體,否則退出循環(huán)。這種形式的循環(huán)體至少能被執(zhí)行一次。
  例如,在要求用戶輸入密碼時(shí),一般都要給用戶三次機(jī)會(huì),每次的輸入過(guò)程和判斷過(guò)程都相同,這時(shí)就可以使用循環(huán)語(yǔ)句。
  Sub 輸入密碼()
   Dim strPassword As String                                                            '保存密碼
   Dim i As Integer                   '輸入密碼的次數(shù)
   Do
                  strPasswor = InputBox("請(qǐng)輸入密碼")                                 '輸入密碼
                  If strPassword = "wyh" Then                                                     '判斷密碼是否正確
     Exit Do                                                                                   '退出循環(huán)
     Else
                       MsgBox("請(qǐng)輸入正確的密碼!")
                  End If
                   i = i + 1
                 Loop While i < 3
                 If i >= 3 Then                                                                             '超過(guò)正常輸入密碼次數(shù)
                    MsgBox "未登錄用戶"
                    End
    Else
                     MsgBox "歡迎你使用本系統(tǒng)!"
                End If
       End Sub
  程序中使用“Do……Loop While”循環(huán)讓循環(huán)體至少執(zhí)行一次。程序的流程圖如圖7-11所示。
       
 
  在循環(huán)體中,首先是顯示一個(gè)輸入框讓用戶輸入密碼;接著對(duì)用戶輸入的密碼進(jìn)行判斷,如果密碼正確,則執(zhí)行Exit Do語(yǔ)句退出循環(huán),執(zhí)行Loop While下面的語(yǔ)句,如果密碼錯(cuò)誤,將顯示一個(gè)提示信息,并累計(jì)錯(cuò)誤次數(shù);最后判斷是否繼續(xù)循環(huán)。
  7.4.2 While……Wend循環(huán)
  “While……Wend”循環(huán)語(yǔ)句的功能與“Do……While”循環(huán)相同,是從Basic的早期版本中保留下來(lái)的語(yǔ)句,VBA保留它是為了向后兼容,其語(yǔ)法格式如下:
  While 邏輯表達(dá)式
    循環(huán)體
    ……
  Wend
  如果“邏輯表達(dá)式”為True,則所有的“循環(huán)體”語(yǔ)句都會(huì)執(zhí)行,一直執(zhí)行到Wend語(yǔ)句,然后再回到While語(yǔ)句,并再一次檢查“邏輯表達(dá)式”的值,如果還是為True,則重復(fù)執(zhí)行;如果不為True,則程序會(huì)從Wend語(yǔ)句之后的語(yǔ)句繼續(xù)執(zhí)行。
  7.4.3 For……Next循環(huán)
  “For……Next”語(yǔ)句以指定次數(shù)來(lái)重復(fù)執(zhí)行循環(huán)體。與Do循環(huán)不同,F(xiàn)or循環(huán)使用一個(gè)叫做計(jì)數(shù)器的變量,每重復(fù)一次循環(huán)之后,計(jì)數(shù)器變量的值就會(huì)增加或減少。在For循環(huán)中可以使用Exit For語(yǔ)句隨時(shí)退出該循環(huán)。For循環(huán)的語(yǔ)法格式如下:
  For 循環(huán)變量=初始值 To 終值 [Step 步長(zhǎng)值]
    語(yǔ)句序列1
   ?。跡xit For]
    語(yǔ)句序列2
  Next?。垩h(huán)變量]
  其中:步長(zhǎng)值可正可負(fù)。如果步長(zhǎng)值為正,則初始值必須小于或等于終值才能執(zhí)行循環(huán)體,否則退出循環(huán);如果步長(zhǎng)值為負(fù),則初始值必須大于或等于終值,這樣才能執(zhí)行循環(huán)體。如果沒(méi)能設(shè)置Step,則步長(zhǎng)值默認(rèn)為1。“For……Next”循環(huán)結(jié)構(gòu)的流程圖如圖7-12所示。
    
 ?。郑拢翀?zhí)行For循環(huán)時(shí)的過(guò)程如下:
  步驟1 將初始值賦值給循環(huán)變量。
  步驟2 判斷循環(huán)變量是否超過(guò)終值,若為真(True),退出循環(huán),執(zhí)行Next的下一語(yǔ)句。這里的“超過(guò)終值”有兩種意思:若步長(zhǎng)值為負(fù)數(shù)時(shí),超過(guò)就是循環(huán)變量的值小于終值;而當(dāng)步長(zhǎng)值為正數(shù)時(shí),超過(guò)就是循環(huán)變量的值大于終值。
  步驟3 執(zhí)行循環(huán)體。
  步驟4 循環(huán)體執(zhí)行完后到達(dá)Next語(yǔ)句時(shí),循環(huán)變量累加上步長(zhǎng)值。
  步驟5 重復(fù)步驟2到步驟4。
  For循環(huán)一般都可計(jì)算出循環(huán)體的執(zhí)行次數(shù),計(jì)算公式如下:
  循環(huán)次數(shù)=【(終值-初值)/步長(zhǎng)值】+1
  這里用中括號(hào)表示取整。
  在事先不知道循環(huán)體需要執(zhí)行多少次時(shí),應(yīng)該用Do循環(huán);而在知道循環(huán)體要執(zhí)行的次數(shù)時(shí),最好使用“For……Next”循環(huán)。
  例如,要編寫代碼完成以下工作:在工作表“Sheet2”的前100行中,如果第2列單元格的值為0,則刪除所在行。可使用“For……Next”循環(huán)語(yǔ)句編寫如下代碼:
  Sub 使用 For 循環(huán)刪除為0的行()
    Dim?。椤s Integer
    With Sheets("sheet2")
                      For i = 1 To 100
                           If .Cells(i,2).EntireRow.Delete
           End If
       Next
    End With
  End Sub
  比較兩個(gè)過(guò)程可以看出,使用“For……Next”循環(huán)時(shí),不需要開發(fā)人員手工編寫代碼更新循環(huán)變量,而使用“Do While……Loop”循環(huán)時(shí),必須在循環(huán)體中包含更改循環(huán)條件的語(yǔ)句,否則循環(huán)將一直執(zhí)行下去,永遠(yuǎn)退不出來(lái),形成死循環(huán)。
  7.4.4 循環(huán)的嵌套
  與分支結(jié)構(gòu)類似,循環(huán)結(jié)構(gòu)也可進(jìn)行嵌套,即將一個(gè)循環(huán)放置在另一個(gè)循環(huán)中。VBA允許在同一過(guò)程里嵌套多種類型的循環(huán)。
  在編寫嵌套循環(huán)程序的代碼時(shí)一定要注意每個(gè)循環(huán)語(yǔ)句的配對(duì)情況。如圖7-13所示,其中(a)是正確的嵌套關(guān)系,第一個(gè)Next關(guān)閉了內(nèi)層的For循環(huán),而最后一個(gè)Loop關(guān)閉了外層的Do循環(huán)。同樣,在嵌套的If語(yǔ)句中,End If語(yǔ)句自動(dòng)與最靠近的前一個(gè)If語(yǔ)句配對(duì)。嵌套的Do……Loop結(jié)構(gòu)的工作方式也是一樣的,最內(nèi)圈的Loop語(yǔ)句與最內(nèi)圈的Do語(yǔ)句匹配。圖7-13(b)則是錯(cuò)誤的嵌套關(guān)系。
     
  第4章中編寫的九九乘法表就使用了兩個(gè)For循環(huán)進(jìn)行嵌套,其代碼如下:
  Private Sub cmd99_Click()
   Dim i As Integer
   Dim j As Integer
   Dim StrMsg As String
   For i = 1 To 9
         For j = 1 To 9
      strMsg = strMsg & "*" & j & "=" & i * j & ""
     Next j
     strMsg = strMsg & vbCrLf
   Next i
            MsgBox strMsg , , "九九乘法表"
  End Sub
  分析嵌套循環(huán)時(shí),可從最內(nèi)層的循環(huán)開始。以上代碼最內(nèi)層循環(huán)的語(yǔ)句為:
  For j= 1 To?。?/div>
    strMsg = strMsg & i & "*" & j & "=" & i * j & " "
  Next j
  這部分代碼用來(lái)生成一行數(shù)據(jù),假設(shè)i為1,執(zhí)行完以上代碼后,變量strMsg保存的內(nèi)容如下:
  1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
  將內(nèi)循環(huán)精簡(jiǎn)為一個(gè)命令(如本例中的“輸出一行數(shù)據(jù)”),則九九乘法表的程序變?yōu)橐韵滦问剑?/div>
  Private Sub cmd99_Click()
   Dim i As Integer
   Dim j As Integer
   Dim strMsg As String
   For i = 1 To 9
     輸出一行數(shù)據(jù)
     strMsg = strMsg & vbCrLf
   Next i
   MsgBox strMsg, , "九九乘法表"
  End Sub
  即可得到一個(gè)單循環(huán)。該單循環(huán)執(zhí)行9次即可得到9行數(shù)據(jù),也就得到了需要的乘法表。
  注意:在嵌套結(jié)構(gòu)里的循環(huán)結(jié)構(gòu)中使用Exit語(yǔ)句時(shí),退出的只是包含該語(yǔ)句的當(dāng)前循環(huán)結(jié)構(gòu),而不是整個(gè)黃磊結(jié)構(gòu)。
  7.4.5 Goto語(yǔ)句
  使用Goto語(yǔ)句,可無(wú)條件地將程序代碼跳轉(zhuǎn)到指定的行去執(zhí)行。VBA中保留Goto語(yǔ)句是為了保持與早期的Basic版本兼容。Goto語(yǔ)句的語(yǔ)法格式如下:
  Goto 行號(hào)/標(biāo)號(hào)
  注意:Goto只能跑到它所在過(guò)程中的行。
  要使用Goto語(yǔ)句,首先需用了解VBA中語(yǔ)句的行號(hào)和標(biāo)號(hào)。在早期的Basic語(yǔ)言中,每一行程序都有一個(gè)行號(hào),行號(hào)按從小到大的順序排列,例如:
  Sub 使用Do循環(huán)刪除為0的行()
  10 Dim i As Integer
  20 i = 1
        30   With Sheets("sheet2")
  40 Do While i <= 100
  50      If .Cells(i,2) = 0 Then
  60            .Cells(i,2).EntireRow.Delete
  70  End If
  80  i = i + 1
  90 Loop
  100 End With
  End Sub
  在VBA中,執(zhí)行這樣的代碼也不會(huì)出錯(cuò)。為程序添加行號(hào)的目的就是方便使用Goto語(yǔ)句跳轉(zhuǎn)到相應(yīng)的語(yǔ)句去執(zhí)行。
  隨著結(jié)構(gòu)化程序設(shè)計(jì)方法的使用,使用Goto語(yǔ)句跳轉(zhuǎn)的方式已經(jīng)不常用了,也就不再需要為每行代碼添加行號(hào)了。
  為了使Goto跳轉(zhuǎn)到需要的地方,可在程序中添加標(biāo)號(hào)。標(biāo)號(hào)是以英文字母開頭的一個(gè)標(biāo)識(shí)符后加上一個(gè)冒號(hào)構(gòu)成的。在程序代碼中輸入的標(biāo)號(hào)始終是靠左對(duì)齊的。
  例如,以下代碼使用Goto語(yǔ)句來(lái)進(jìn)行循環(huán)操作,刪除單元格為0的行。
  Sub 使用Goto語(yǔ)句刪除為0的行()
    Dim i As Integer
    i = 1
  linel:
   With Sheets("sheet2")
    If .Cells(i,2) = 0 Then
      .Cells(i,2).EntireRow.Delete
    End If
    i = i + 1
    If i <= 100 Then GoTo linel
   End With
  End Sub
  注意:這里只是演示Goto語(yǔ)句的用法,不建議讀者在程序中使用太多的Goto語(yǔ)句,因?yàn)槭褂肎oto語(yǔ)句會(huì)使程序代碼不容易閱讀及調(diào)試。應(yīng)盡可能使用結(jié)構(gòu)化控制語(yǔ)句(Do……Loop,F(xiàn)or……Next,If……Then……Else和Select Case)。
 
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服