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-programming-loop-20161206-1

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 中斷迴圈

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

參考資料:ExcelFunctions.netExcel VBA ProgrammingtutorialspointExcel Easystackoverflow

Windows, 程式設計

5 Comments

  1. Chen

    VBA的各個教學的寫得淺顯易懂
    幫助很大
    希望大大有空還可以繼續寫更深入的教學文章
    謝謝!

  2. Learning_VBA

    過年期間想要自學VBA 您的文章對初學者幫助很大 謝謝

  3. Lai

    您好,看您教的VBA貼文,讓我學到很多
    非常感謝您
    而我有一個迴圈的問題想請問您
    假如:
    SUB TRY()
    DIM W,S,X AS INTEGER
    W=0
    FOR S= O TO 10
    X=W+S
    IF S>=4 THEN
    EXIT FOR
    END IF
    NEXT S
    MSGBOX “X=” & X
    END SUB

    1.為何X跑出的結果卻是4

    2.上述的解釋不是:
    [算X=W+S的迴圈,當S大於等於4時跳出終止迴圈嗎?]
    3.大於等於4(>=4)不就只要為4或大於是就終止迴圈,所以不是應該只有加1+2+3=6嗎?為何答案為10?

    4.想請問一下,為何把上述的X=W+S改成W=W+S答案跑出來的結果卻不一致呢?
    (是不能為3個變數嗎?可是我一開始有DIM宣告X,W,S為整數阿)

    不好意思,為初學者,所以問題較多!

    • G. T. Wang

      我想您的問題是屬於數學邏輯上的問題,並不是程式語法問題。簡單來說就是您還沒完全想懂這個程式是怎麼跑的,仔細多想幾遍應該就會想通了。

Leave a Reply