Developer

【ExcelVBA】Do Loopステートメント②
2022.01.13
Lv1

【ExcelVBA】Do Loopステートメント②

For NextとDo Loop

前回Do Loopについて説明しました。
繰り返し処理の際に使用されるステートメントです。繰り返し処理を行うためのステートメントは他にもあり、どれを使用してほぼ同じ処理をすることが可能です。
ただし、状況によって書きやすさなどが異なります。
ある繰り返し処理用ステートメントではシンプルに書けるものの、別の繰り返し処理用ステートメントではひと手間かかってしまうといったようなことがあります。
今回は同じ繰り返し処理で使用されるFor Nextと比較してみましょう。

サンプルコード

A1からA6までの数値を足し算する処理をFor NextステートメントとDo Loopステートメントを使用して書いてみましょう。

まずはFor Nextからです。

Sub VBA基礎第35回_1()
    
    Dim sum As Integer
    Dim i As Integer
    sum = 0
   
    'データを読み込んでいきマイナスの値が出てくるまで足し算しする
    For i = 1 To 6
        sum = sum + Cells(i, 1)
    Next
    
    'sumを表示
    MsgBox "合計は" & vbCrLf & sum
       
End Sub

次はDo Whileです。

Sub VBA基礎第35回_2()
    
    Dim sum As Integer
    Dim i As Integer
    sum = 0
    i = 1
   
    'データを読み込んでいきマイナスの値が出てくるまで足し算しする
    Do While i <= 6
        sum = sum + Cells( i, 1)
        i = i + 1
    Loop
    
    'sumを表示
    MsgBox "合計は" & vbCrLf & sum
       
End Sub

実行結果はどちらも以下のようになります。

For Nextステートメントの場合は、自動的にstep(今回指定していないのでデフォルトの1)の分だけiの値が加算されます。
Do Loopステートメントのほうは自身で条件式で使用しているiの値を加算する処理を書く必要があります。
これを忘れると処理が無限に繰り返されることになりますので気をつけて下さい。
今回のような繰り返す回数が決まっている処理の場合、どちらの処理を使用しても特に問題はありません。
しかし繰り返す回数が不定な処理の場合は、記述のしやすさが変わります。
例えばA列の値を0が出てくるまで加算するというような処理をしたい場合です。

0がどこに出てくるのかが決まっていない場合、ループの回数がわかりません。
この場合、For Nextステートメントでは厳しくなります。

Sub VBA基礎第35回_3()
    
    Dim sum As Integer
    Dim i As Integer
    sum = 0
   
    'とりあえず上限を大きめにして処理をする
    For i = 1 To 10000
        If Cells(i, 1) = 0 Then			'0が来た時に処理をする
            'Forを抜ける処理を書く
        End If
        
        sum = sum + Cells(i, 1)
        
    Next
    
    'sumを表示
    MsgBox "合計は" & vbCrLf & sum
       
End Sub

とりあえず上限を大きめの数(今回は10000)にしIfステートメントを使用して0が来た時に繰り返し処理を終わらせることはできます。Forを抜ける処理はまだ説明していませんので、今回は割愛しています。
ただ10000行以上データが存在した場合機能しなくなります。

Do Loopステートメントの場合は以下のように記述できます。

Sub VBA基礎第35回_4()
    
    Dim sum As Integer
    Dim i As Integer
    sum = 0
    i = 1
   
    'データを読み込んでいき足し算しする
    Do While Cells(i, 1) <> 0                 'until Cells(i, 1) = 0 でも同じです
        sum = sum + Cells(i, 1)
        i = i + 1
    Loop
    
    'sumを表示
    MsgBox "合計は" & vbCrLf & sum
       
End Sub

結果は以下のようになります。

今回条件のところでWhileを使用して0と等しくないという条件を満たしている間、繰り返しています。
Untilを使用して0と等しいという条件を満たさない間という書き方もできます。
For Nextと違いIfなどを使用せずに記述することができます。
このようにFor NextステートメントとDo Loopステートメントでは、どのように繰り返しさせるかによって書きやすさが異なります。
繰り返し回数が決まっている場合、For Nextステートメントのほうが使いやすい場合が多く、繰り返す回数が不定で終了条件がはっきりしている場合はDo Loopステートメントが使いやすいのではないかと思います。
個人的には無限に繰り返しさせて、ある条件で繰り返しを止めるというような処理をしたい場合にはDo Loopステートメントの方を使用しています。
状況によって使い分けられるようにしましょう。

まとめ

繰り返し処理のステートメントであるFor NextとDo Loopは、どちらも同様の処理を書くことができますが
繰り返し回数など行いたい処理によって書きやすさが変わります。
状況によって使い分けることで簡潔なコードになります。

確認問題

以下のFor Nextステートメントを使って書かれたコードをDo Loopステートメントで記述してください。

Sub VBA基礎第35回_5()
    
    Dim a(4) As Integer
    Dim i As Integer
  
    '配列に値を入れる
    For i = 0 To 4
        a(i) = i
        
    Next
    
    '配列を表示
    MsgBox a(0) & " " & a(1) & " " & a(2) & " " & a(3) & " " & a(4)
       
End Sub
答え

Sub VBA基礎第35回_6()
    
    Dim a(4) As Integer
    Dim i As Integer
    i = 0
  
    '配列に値を入れる
    Do While i < 5
        a(i) = i
        i = i + 1
    Loop
    
    '配列を表示
    MsgBox a(0) & " " & a(1) & " " & a(2) & " " & a(3) & " " & a(4)
       
End Sub

For Nextと違い、カウンタを自身で加算しなければならないことに注意してください。

次回は、「Exitステートメント」です。

 

連載目次リンク

ExcelVBA 入門 連載目次