ExcelVBA Step_5_2 制御構造 ・ ループ

For 〜 Nextステートメント

同一処理を何度も繰り返すことをループと言います。ループには、指定した回数だけを繰り返す方法や、ある特定の状況が発生するまで繰り返す方法などがあります。
For 〜 Next ステートメントは、あらかじめ処理回数を決めておくループの方法です。
処理を途中で中止しループを抜ける場合は、Exit Forを使用します。
[Step 加算値] を省略すると Step 1 と同じ処理になります。
変数が、最終値を超えるとループを抜けます。
《構文》
For 変数=初期値 To 最終値 [Step 加算値]
 
        繰り返す処理

Next


《サンプルプログラム》
Sub 繰り返し_1()

'回数を指定した繰り返し

   Dim i As Integer
   Dim sheetcount As Integer

   sheetcount = Worksheets.Count      'ワークシートの数を取得

   For i = 1 To sheetcount            'シートの数だけ繰り返す
      Worksheets(i).Name = "Work" & i 'シート名を変更する
   Next i                             '繰り返しの先頭へ

End Sub

For Each 〜 Nextステートメント

コレクションを対象にループするときには、コレクションに含まれるオブジェクト数を意識する必要のない For Each 〜 Nextステートメントを使うのが便利です。

《構文》
For Each オブジェクト変数 In コレクション

《サンプルプログラム》
For Each〜Next ステートメントの中で特定のワークシートを削除します。
For Each〜Next ステート内で処理されるオブジェクト変数には、前もって Setステートメントでオブジェクトを代入しておく必要はありません。
Sub 繰り返し_2()


 Dim mySheet As Worksheet 'オブジェクト変数の宣言
 
 For Each mySheet In Worksheets 'For Each節の構文
    
    If mySheet.Name = "Sheet3" Then
       mySheet.Delete 'シートを削除したら
       Exit For       '強制的にループから抜ける
    End If
  Next mySheet 'すべてのオブジェクトにアクセスするとループは終了する
    

End Sub

For Each〜Nextステートメントを使って、指定セルのフォントを赤色にします。
下記のプロシジャーを実行するには、売上集計ブックを開いておきます。
Sub 繰り返し_3()

'セル範囲に対するループ

Dim myRange As Range 'オブジェクト型の変数宣言

For Each myRange In Worksheets("売上集計").Range("D6:I12")
   If myRange.Value >= 3000 Then myRange.Font.ColorIndex = 3
Next myRange

End Sub

Do 〜 Loop ステートメント

Do〜Loopステートメントは、「条件が満たされるまで」または「条件が満たされている間」ループを継続します。
「条件が満たされるまで処理を繰り返す」場合は、Untilキーワードを使います。 Do Until 〜 Loop は、ブロックを実行する前に条件を判定します
Do 〜 Loop Untilは、ブロックを実行してから条件を判定します。
違う点は、Do Until〜Loop ステートメントは1度もブロックを実行しない場合がありますが、Do 〜 Loop Untilは必ず一度は実行することです。
「条件が満たされている間処理を繰り返す」場合は、、Whileキーワードを使います。 Do While 〜 Loop は、ブロックを実行するまえに条件を判定します
Do 〜 Loop Whileは、ブロックを実行してから条件を判定します。
Do〜Loopステートメントを使う場合は、ループの上限が決まっているわけではありませんので、繰り返しから抜ける命令を必ず記述します。その理由は、永久に終わらない無限ループとなってしまうからです。
ループ途中で抜けたい場合は、Exit Doステートメントを使います。

《Do Until 〜 Loop のサンプル》
Sub 繰り返し_4()

    'ループの前に条件を判定するプロシジャー
    'このプロシジャーを実行するには「売上集計」シートをアクティブにしてください  

    Range("C6").Select '最初に選択するセル
    
   'セルが空白ならば(満たされたら)処理は実行されない
    Do Until ActiveCell.Value = ""
        ActiveCell.Font.Bold = True 'アクティブセルを太字にする
        ActiveCell.Offset(1).Select '次行のセルに移動する。忘れると無限ループになる
    Loop

End Sub

《Do 〜 Loop Until のサンプル》
Sub 繰り返し_5()

   'ループの後で条件を判定する
   'このプロシジャーを実行するには「売上集計」シートが必要です。
  

    Range("C6").Select '最初に選択するセル
    
   '最初の1回は必ずループに入る
    Do
        ActiveCell.Font.Italic = True 'アクティブセルを斜体にする
        ActiveCell.Offset(1).Select   '次行のセルに移動する
    Loop Until ActiveCell.Value = ""  '条件判断をする

End Sub
 


《Do While 〜 Loop のサンプル》
Sub 繰り返し_6()

'条件が満たされている間繰り返す(ループの前に判定)
'このプロシジャーを実行するには「売上集計」シートが必要
'※上記のシートを使わないときにはループを中止するためのデータを必ず入力しておく。

   Range("D2").Select '最初に選択するセル
 
   'セルが空白の間処理を繰り返す
   Do While ActiveCell.Value = ""   '条件判定
        ActiveCell.Value = "A"      'アクティブセルにAを入力する
        ActiveCell.Offset(1).Select '次行のセルに移動する
   Loop                             '繰り返し
    

End Sub




《Do 〜 Loop While のサンプル》

Sub 繰り返し_7()

'条件が満たされている間繰り返す(ループの後に判定)
'このプロシジャーを実行するには「売上集計」シートが必要
'※上記のシートを使わないときにはループを終わらせるためのデータを必ず入力しておく。

   Range("E2").Select '最初に選択するセル
 
   'セルが空白の間処理を繰り返す
   Do                               '1回目は必ずループに入る
        ActiveCell.Value = "B"      'アクティブセルにBを入力する
        ActiveCell.Offset(1).Select '次行のセルに移動する
   Loop While ActiveCell.Value = "" '条件判定
    


End Sub