Excel VBA 程式設計教學:迴圈控制,For Loop、For Each 與 Do Loop

本篇介紹 Excel VBA 的迴圈使用方式,並提供實用的範例程式碼。

迴圈控制是各種程式語言都會有的基本功能,他的作用是可以讓電腦重複執行某一段類似的動作,在運用得當的情況下,可以幫助使用者快速處理大料的資料,既省時又省力。


在 Excel VBA 中的迴圈主要可分為 For LoopFor EachDo Loop 這幾種,不同的迴圈適用於不同類型的問題,以下是各種 VBA 迴圈的語法教學。

For Loop 迴圈

For Loop 迴圈主要用於已知重複次數的問題,也就是在執行迴圈之前,就已經事先知道要迭代幾次。

For 迭代變數 = 開始值 To 結束值
運算內容
Next 迭代變數

For Loop 迴圈執行時,迭代變數會從開始值不斷遞增至結束值,每次遞增時都會執行一次運算內容。以下是一個計算從 110 總和的範例:

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 迴圈。整個程式執行完之後,就會把 110 的總和算出來:

Excel VBA For Loop 迴圈

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 的總和:

Excel VBA Exit For 中斷迴圈

For Each 迴圈

For Each 迴圈是 For Loop 迴圈的另外一種精簡寫法,兩者功能差不多,只是在某些狀況下使用 For Each 迴圈會比較方便。

一般若要使用 For Loop 迴圈對陣列中的每個元素逐一處理時,必須明確指定開始與結束的索引值,再以索引值取出陣列中的元素做進一步的運算,而 For Each 迴圈則是可以自動將陣列中的元素逐一取出,放進迴圈的迭代變數中處理,這樣的寫法會比 For Loop 更精簡。

For Each 迭代變數 In 陣列
運算內容
Next 迭代變數

這是使用 For Each 迴圈找出目前 Excel 中所有工作表的範例程式:

Dim wSheet As Worksheet
For Each wSheet In Worksheets
  MsgBox "找到工作表: " & wSheet.Name
Next wSheet

這個 For Each 迴圈會將 Worksheets 中的每一個元素逐一取出,儲存在 wSheet 變數中,並且執行迭代的內容。這個例子會將 Excel 中的每一張工作表取出來,呼叫 MsgBox 輸出每一張工作表的名子,也就是說 Excel 中的工作表有幾張,這個迴圈就會執行幾次。

Excel VBA For Each 迴圈

Do Loop 迴圈

Do Loop 迴圈可以重複執行某一段程式碼,直到指定的條件判斷式成立或是不成立的時候,才停止迴圈的執行,而這類的迴圈有好幾種不同的型式,使用者可以依照需求選擇適合的寫法。

Do While Loop 迴圈

Do While Loop 迴圈可以在每一次迭代時,檢查一個指定的條件判斷式,如果成立的話(判斷為 True)就會繼續執行,而如果條件不成立(判斷為 False)的話,就會中止迴圈。

Do While 條件判斷式
運算內容
Loop

以下是一個使用 Do While Loop 迴圈計算 110 總和的範例。

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 就是 110 的加總數值。

Excel VBA Do While Loop 迴圈

While 的條件判斷式也可以放在迴圈結尾處,這樣的話迴圈在執行時就會先執行第一次的迭代,執行完第一次之後才判斷是否要繼續執行下一次的迭代,如果條件成立則繼續執行,若不成立就立刻中止迴圈,這樣的寫法只是檢查條件判斷式的時機不同,觀念上大同小異。

Do
運算內容
Loop 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

以下是一個 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 迴圈也很類似。

Do
運算內容
Loop Until 條件判斷式

以下是一個簡單的範例。

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 跳出迴圈,所以這個程式最後所得到的結果就是從 14 的總和。

Excel VBA Exit Do 中斷迴圈

應用範例

迭代 Excel 工作表

此範例示範如何結合 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

迭代 Excel 工作表

更多關於 VBA 的教學文章,請參考 VBA 程式設計

參考資料:ExcelFunctions.netExcel VBA ProgrammingtutorialspointExcel Easystackoverflow

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang
標籤: ExcelOfficeVBA

Recent Posts

光陽 KYMCO GP 125 機車接電發動、更換電瓶記錄

本篇記錄我的光陽 KYMCO ...

2 年 ago

[開箱] YubiKey 5C NFC 實體金鑰

本篇是 YubiKey 5C ...

2 年 ago

[DIY] 自製竹火把

本篇記錄我拿竹子加上過期的苦茶...

3 年 ago