Excel VBA入門(四)流程控制2-循環控制


所謂循環控制,即在循環執行一段代碼,用於完成一些重復性任務。

VBA中的循環控制語句主要有3種:for、while、loop。對於大多數人來說,for的使用頻率最高,而我個人也覺得for是最為靈活的,在很多場合下都可以使用,相較while和loop,其邏輯也再加清晰,更便於對循環進行控制。

1. For循環

for循環有兩種形式,一種為明確地知道要循環的次數的,比如從1到10循環執行10次;另一種則用於循環歷遍某個集合對象,這個對象有多少個單位就循環執行多少次,可以視為是未知循環次數的。

① 循環次數已知的for

其格式如下:

for 計數變量=開始值 to 結束值
    ' 用於循環執行的語句
next

通常我們會需要對Excel表格中的每一行(或每一列)進行循環歷遍,對其中單元格的值進行各種操作。這時候,就可以先求出該工作表中有多少行(或列),然后再逐行(列)進行判斷。這個操作單元格的示例會在后面有專門的章節來講解演示,這里就只講循環語句本身了。

示例如下:

For i = 1 To 10
    Debug.Print i
Next

以上代碼將會依然輸出1到10這10個數字

在這種形式的For里面,還可以在[結束值]后面加上Step,然后跟着寫上步長,如果省略,則默認步長為1。像上例,默認是把i從1遞增到10,即:1、2、3、4、5、6、7、8、9、10這樣依次遞增的。如果像下面這樣寫,把步長設置為2,則變成了:1、3、5、7、9。則循環體(即For里面的代碼)只會執行5次。

For i = 1 To 10 Setp 2
    Debug.Print i
Next

輸出:1 3 5 7 9

② 循環次數不確定的For

格式如下:

For Each 循環變量 In 循環對象
    ' 循環執行的語句
Next 循環變量

結合之前講過的數組來舉個例子。假設已有數組myArr並且已賦值,則可以用以下代碼歷遍它的每個值:

For Each a In myArr
    Debug.Print a
Next a

這樣就不管這個數組包含有多少個元素,都可以逐個歷遍。

2. Loop循環

Loop循環或許把它稱為Do...Loop循環會更加合適。因為它的格式是先Do再Loop的。但我喜歡把它叫Loop循環。

Loop循環也有兩種形式。第一種是先判斷循環條件再開執行,第二種先執行一次然后再判斷循環條件是否成立。

① 先判斷再執行

格式如下:

Do [While | Until] 循環條件
    ' 用於循環執行的語句
Loop

這里的[While | Until]表示兩者隨便用一個都可以。While就是當條件成立的時候就執行,而Until就是直到條件成立時就停止執行。也就是說,While用於指定循環的條件,說明什么時候就執行循環,而Until用於指定停止循環的條件,說明什么時候不再執行循環。這么說可能有些許抽象,舉例說明。

Do While ... Loop

Sub test()
    Dim i As Integer
    i = 5

    Do While i > 0
        Debug.Print i
        i = i - 1
    Loop
End Sub

上例的輸出結果是:5 4 3 2 1

Do Until ... Loop

Sub test()
    Dim i As Integer
    i = 5

    Do Until i < 0
        Debug.Print i
        i = i - 1
    Loop
End Sub

上例的輸出結果是:5 4 3 2 1 0

邏輯還是很簡單的,大家可以稍微分析下為什么用While時輸出到1就停止了,而用Until時后面會多出個0,而如果需要不讓它輸出0程序應該怎么改寫。搞清楚原因,這個While和Until的區別也就知道了,Loop循環應該也就掌握了。

② 先執行再判斷

先執行再判斷,即將條件判斷語句放到Loop的后面,先Do一次,然后再Loop While或者Loop Until。

格式如下:

Do
    ' 用於循環執行的語句
Loop [While | Until] 循環條件

示例如下:

Do ... Loop While

Sub test()
    Dim i As Integer
    i = 5

    Do
        Debug.Print i
        i = i - 1
    Loop While i > 0
End Sub

輸出結果為:5 4 3 2 1

Do ... Loop Until

Sub test()
    Dim i As Integer
    i = 5

    Do
        Debug.Print i
        i = i - 1
    Loop Until i < 0
End Sub

輸出結果為:5 4 3 2 1 0

Loop循環總結:可以看到,無論是采用哪種形式的Loop循環,都可以得到相同的結果,實現同樣的功能,而具體使用哪一種,純粹是個人習慣(個人喜歡)。但無論使用哪一種,都一定一定要記得,必須要有能使循環結束的語句出現在循環中(例如前面例子中的i=i-1),否則程序會永遠不停地執行下去。這時候除了在任務管理器中結束Excel外,就沒有什么更好的辦法了。

3. While循環

While循環有點類似於Loop循環,先判斷條件是否成立,再開始(或結束)循環。而我看過的教程里面,有些是沒有講到While循環的。可能是作者覺得沒有必要講了。

While循環的格式如下:

While 條件判斷語句
    ' 用於循環執行的語句
Wend

示例如下:

Sub test()
    Dim i As Integer
    i = 5

    While i > 0
        Debug.Print i
        i = i - 1
    Wend
End Sub

輸出結果為:5 4 3 2 1

同樣要記住的是,必須要有使循環能夠結束的條件,否則程序會進入死循環中。

由以上示例可以看出,這3種循環語句,是有着某些共同之處的,特別是Loop和While循環。而事實上很多循環事件,用3者都能實現。具體使用哪一種,則或根據實際情況和使用習慣來選擇。但相信對於大多數人來說,都會優先考慮使用For循環,因為它的條理更加清晰,流程控制更簡易,適用的場景更廣,語句也更簡練(至少它不需要顯式添加使循環結束的語句)


本系列教程其它文章

Excel VBA 入門(零)
Excel VBA 入門(一)數據類型
Excel VBA 入門(二)數組和字典
Excel VBA 入門(三) 流程控制1-條件選擇
Excel VBA 入門(四)流程控制2-循環控制
Excel VBA 入門(五)Excel對象操作
Excel VBA 入門(六)過程和函數
Excel VBA 入門(七)注釋、宏按鈕及錯誤處理
Excel VBA 入門(八)單元格邊框
Excel VBA 入門(九)操作工作薄
Excel VBA 入門(十)用戶窗體開發


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM