本篇介紹 Excel VBA 的迴圈使用方式,並提供實用的範例程式碼。
迴圈控制是各種程式語言都會有的基本功能,他的作用是可以讓電腦重複執行某一段類似的動作,在運用得當的情況下,可以幫助使用者快速處理大料的資料,既省時又省力。
For Loop
、For Each
與 Do Loop
這幾種,不同的迴圈適用於不同類型的問題,以下是各種 VBA 迴圈的語法教學。
For Loop
迴圈For Loop
迴圈主要用於已知重複次數的問題,也就是在執行迴圈之前,就已經事先知道要迭代幾次。
在 For Loop
迴圈執行時,迭代變數會從開始值
不斷遞增至結束值
,每次遞增時都會執行一次運算內容
。以下是一個計算從 1
到 10
總和的範例:
Dim i, s As Integer s = 0 For i = 1 To 10 s = s + i Next i MsgBox "s = " & s
以這個例子來說 i
就是迭代變數,在 For Loop
迴圈第一次執行時,i
這個變數會被設定為 1
,然後執行 s = s + i
,接著讓 i
遞增為 2
,再執行一次 s = s + i
,以此類推,直到 i
遞增到 10
並執行完該次迭代之後,才會跳出 For Loop
迴圈。整個程式執行完之後,就會把 1
到 10
的總和算出來:
Exit For
中斷迴圈For Loop
迴圈在正常的狀況下會一直執行,直到迭代變數遞增至結束值
為止,如果想要中途跳出迴圈,可以加上 Exit For
來中斷迴圈:
Dim i, s As Integer s = 0 For i = 1 To 10 s = s + i If i >= 4 Then Exit For ' 中斷迴圈 End If Next i MsgBox "s = " & s
在這個範例中,我們在 For Loop
迴圈當中加入了一個 If Then
條件判斷式,當 i
大於或等於 4
的時候,就跳出迴圈,所以最後我們會得到從 1
加到 4
的總和:
For Each
迴圈For Each
迴圈是 For Loop
迴圈的另外一種精簡寫法,兩者功能差不多,只是在某些狀況下使用 For Each
迴圈會比較方便。
一般若要使用 For Loop
迴圈對陣列中的每個元素逐一處理時,必須明確指定開始與結束的索引值,再以索引值取出陣列中的元素做進一步的運算,而 For Each
迴圈則是可以自動將陣列中的元素逐一取出,放進迴圈的迭代變數中處理,這樣的寫法會比 For Loop
更精簡。
這是使用 For Each
迴圈找出目前 Excel 中所有工作表的範例程式:
Dim wSheet As Worksheet For Each wSheet In Worksheets MsgBox "找到工作表: " & wSheet.Name Next wSheet
這個 For Each
迴圈會將 Worksheets
中的每一個元素逐一取出,儲存在 wSheet
變數中,並且執行迭代的內容。這個例子會將 Excel 中的每一張工作表取出來,呼叫 MsgBox
輸出每一張工作表的名子,也就是說 Excel 中的工作表有幾張,這個迴圈就會執行幾次。
Do Loop
迴圈Do Loop
迴圈可以重複執行某一段程式碼,直到指定的條件判斷式成立或是不成立的時候,才停止迴圈的執行,而這類的迴圈有好幾種不同的型式,使用者可以依照需求選擇適合的寫法。
Do While Loop
迴圈Do While Loop
迴圈可以在每一次迭代時,檢查一個指定的條件判斷式,如果成立的話(判斷為 True
)就會繼續執行,而如果條件不成立(判斷為 False
)的話,就會中止迴圈。
以下是一個使用 Do While Loop
迴圈計算 1
到 10
總和的範例。
Dim i, s As Integer s = 0 i = 1 Do While i <= 10 s = s + i i = i + 1 Loop MsgBox "s = " & s
在這個例子中,一開始先初始化兩個變數,s
變數用於儲存總和值,而 i
則是用於每次迭代的變數,迴圈執行時會先判斷 i
是否小於或等於 10
,如果條件成立則執行迴圈的內容,一直重複執行直到 i
大於 10
為止,所以最後得到的 s
就是 1
到 10
的加總數值。
While
的條件判斷式也可以放在迴圈結尾處,這樣的話迴圈在執行時就會先執行第一次的迭代,執行完第一次之後才判斷是否要繼續執行下一次的迭代,如果條件成立則繼續執行,若不成立就立刻中止迴圈,這樣的寫法只是檢查條件判斷式的時機不同,觀念上大同小異。
以下是一個簡單的範例。
Dim i, s As Integer s = 0 i = 1 Do s = s + i i = i + 1 Loop While i <= 10 MsgBox "s = " & s
Do Until Loop
迴圈Do Until Loop
迴圈與 Do While Loop
迴圈在條件的判斷上剛好相反,Do Until Loop
迴圈會在指定條件不成立(判斷為 False
)時繼續執行,當判斷條件成立時(判斷為 True
)則終止迴圈。
以下是一個 Do Until Loop
迴圈的範例程式碼。
Dim i, s As Integer s = 0 i = 1 Do Until i > 10 s = s + i i = i + 1 Loop MsgBox "s = " & s
Do Until Loop
迴圈也可以將條件判斷式放在迴圈的最後面,這跟上面 Do While Loop
迴圈也很類似。
以下是一個簡單的範例。
Dim i, s As Integer s = 0 i = 1 Do s = s + i i = i + 1 Loop Until i > 10 MsgBox "s = " & s
Exit Do
中斷迴圈如果要在 Do Loop
迴圈執行到一半時終止迴圈的執行,可以在迴圈中加入 Exit Do
,以下是一個範例:
Dim i, s As Integer s = 0 i = 1 Do Until i > 10 s = s + i i = i + 1 If i > 4 Then Exit Do ' 中斷迴圈 End If Loop MsgBox "s = " & s
在這個例子中,我們在迴圈之中加入一個 If
判斷式,讓程式在 i
大於 4
的時候就執行 Exit Do
跳出迴圈,所以這個程式最後所得到的結果就是從 1
到 4
的總和。
此範例示範如何結合 For Loop
迴圈與 Cells
函數(Cells
函數的用法請參考活頁簿、工作表與儲存格),自動迭代處理 Excel 工作表內的資料:
Dim i, j As Integer For i = 1 To 3 For j = 1 To 3 MsgBox ("(" & i & "," & j & ") = " & Cells(i, j)) Next j Next i
更多關於 VBA 的教學文章,請參考 VBA 程式設計。
參考資料:ExcelFunctions.net、Excel VBA Programming、tutorialspoint、Excel Easy、stackoverflow