ポムさんのプログラミング奮闘日記

ポムさんのプログラミング奮闘日記

VBAで作ったツールやプログラミングに関することを書きます

Do While(1) の無限ループを使った繰り返し処理入門 1 - 行ごとに処理をしたい場合 -


今回は DoWhile(1) を使った繰り返し処理のネスト(2重ループ)について書きたいと思います。
Excelのワークシートを処理する場合に、行ごとに処理したい時と、列ごとに処理をしたい時の2つの場合がありますよね。
今回は行ごとに処理を行いたい場合の繰り返し処理の書き方についてご説明したいと思います。

1回目は行ごとに処理を実行したい場合の書き方です。
行ごとの繰り返し処理のイメージはこんな感じ。実際のサンプルコードでは支店が4つある表を使用します。

f:id:Tompsom:20200314123354j:plain
行ごとの繰り返し処理

紹介するサンプルコードに使用する表は次の通りです
とくとくデパートの売上一覧を使います。
ここでは繰り返し処理の説明のみなので、行う処理はセルの値(売上額)をイミディエイトウインドウに表示するだけです。

f:id:Tompsom:20200314124648j:plain
とくとくデパート支店別売上一覧

Sub 繰り返し処理のネスト_2重ループ()

    Dim iGyouCnt           As Long     '行のカウンタ変数
    Dim iRetuCnt           As Long     '列のカウンタ変数
    
    Const ITEM_PosX        As Long = 2 '商品列の列番号
    Const RETU_KAISHI_PosX As Long = 3 '走査対象セルの最初の列番号
    Const GYOU_KAISHI_PosY As Long = 3 '走査対象セルの最初の行番号
           
    'ループ処理の終了条件は DoWhile(1) の直下に記述。""は長さゼロの空文字列を表し、Valueに続いて=記号で書くことで、空白セルを表します。
    '終了条件は状況によって変わります。都度適切な条件を指定します。
    '終了条件の例:
    '  ⇒空白セルもしくは空白ではないセル
    '  ⇒特定の文字列(セルの値、セルの一部の文字列(文字列関数を使用))

    '< 外側のループ >
    '終了条件;B列の「GYOU_KAISHI_PosY + iGyouCnt」行目のセルの値が空白("")かどうか?
    '終了条件をチェックしながら、B列3行目「B3セル」から下方向へ走査する。
    '空白ではない間、【5】~【12】の処理を繰り返す。
    '終了条件を満たした場合の処理
    '    ⇒外側のループを抜ける(【3】)
    '    ⇒プロシージャを終了する【15】
    '大切なのは内側ループの行指定と同じにすること。こうすることで、
    '    ①内側ループ終了条件(【6】)を満たして内側ループを抜け(【8】)、
    '    ②行カウンタがインクリメント(【13】)された時点で、走査対象のセルが1行下に移動する
    '    ③移動した1行下のセルが空白セルなら(【2】)、外側の繰り返し処理も抜けることができる。
        
    Do While (1)  '【1】
        If Worksheets("Sheet1").Cells(GYOU_KAISHI_PosY + iGyouCnt, ITEM_PosX).Value = "" Then '【2】
            Exit Do   '【3】
        End If        '【4】
        
        '<< 内側のループ >>
        '終了条件;走査中のセルが空白セルかどうか?(【6】)
        '終了条件をチェックしながら、C列3行目「C3セル」から右方向へ走査する。
        '実行したい何らかの処理(【10】)後、列カウンタをインクリメント(【11】)することでセルは右方向へ移動する。
        'いずれ数値の入力されていない空白セルが走査される時がやってくる。
        '  終了条件を満たした場合の処理
        '    ⇒列カウンタを0に戻し (【7】)
        '    ⇒繰り返し処理を抜ける  (【8】)
        '    ⇒行カウンタをインクリメント(【13】)
        '    ⇒外側ループへ移動(【1】)
        '    ⇒外側ループのの終了条件(【2】)をチェック
        '    ⇒満たさない場合は再度内側ループへ移動(【5】)
            Do While (1)         '【5】
                If Worksheets("Sheet1").Cells(GYOU_KAISHI_PosY + iGyouCnt, RETU_KAISHI_PosX + iRetuCnt).Value = "" Then '【6】
                    iRetuCnt = 0 '【7】
                    Exit Do      '【8】
                End If           '【9】
            
                '<<< 行いたい処理__START >>>
                
                '走査中のセルの値をイミディエイトウインドウに表示する
                Debug.Print Worksheets("Sheet1").Cells(GYOU_KAISHI_PosY + iGyouCnt, RETU_KAISHI_PosX + iRetuCnt).Value '【10】
            
                '<<< 行いたい処理__END   >>>
                
                iRetuCnt = iRetuCnt + 1  '【11】
            Loop  '【12】
        
        iGyouCnt = iGyouCnt + 1  '【13】
    Loop  '【14】

End Sub  '【15】