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

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

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

1. For循環

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

① 循環次數已知的for

其格式如下:

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

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

示例如下:

For i = 1 To 10n Debug.Print inNextn

以上代碼將會依然輸出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 2n Debug.Print inNextn

輸出:1 3 5 7 9

② 循環次數不確定的For

格式如下:

For Each 循環變數 In 循環對象n 循環執行的語句nNext 循環變數n

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

For Each a In myArrn Debug.Print anNext an

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

2. Loop循環

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

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

① 先判斷再執行

格式如下:

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

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

Do While ... Loop

Sub test()n Dim i As Integern i = 5nn Do While i > 0n Debug.Print in i = i - 1n LoopnEnd Subn

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

Do Until ... Loop

Sub test()n Dim i As Integern i = 5nn Do Until i < 0n Debug.Print in i = i - 1n LoopnEnd Subn

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

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

② 先執行再判斷

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

格式如下:

Don 用於循環執行的語句nLoop [While | Until] 循環條件n

示例如下:

Do ... Loop While

Sub test()n Dim i As Integern i = 5nn Don Debug.Print in i = i - 1n Loop While i > 0nEnd Subn

輸出結果為:5 4 3 2 1

Do ... Loop Until

Sub test()n Dim i As Integern i = 5nn Don Debug.Print in i = i - 1n Loop Until i < 0nEnd Subn

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

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

3. While循環

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

While循環的格式如下:

While 條件判斷語句n 用於循環執行的語句nWendn

示例如下:

Sub test()n Dim i As Integern i = 5nn While i > 0n Debug.Print in i = i - 1n WendnEnd Subn

輸出結果為:5 4 3 2 1

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

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


推薦閱讀:

一個關於PowerQuery(及PowerPivot等工具)和VBA的簡單比較
RFM靜態精細化分析
練習題056答案:九九乘法除法口訣表、十以內加法減法表
專欄導讀-Excel巔峰該如何攀登(Excel學習.序)
將多單元格內容合併到一個單元格居然有這麼多方法,你知道幾種?

TAG:VBA | MicrosoftExcel | MicrosoftOffice |