所謂循環控制,即在循環執行一段代碼,用於完成一些重復性任務。
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 入門(十)用戶窗體開發