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

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

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

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


前回、行ごとに処理を行う場合の繰り返し処理の書き方をご紹介しました。
今回は列ごとに処理を行う場合です。

★★ 行ごとに処理を実行する場合との違い ★★
● 項目名行の行番号を定数に追加。前回の商品名列番号の定数(ITEM_PosX)は不要なのでを削除
●外側のループを抜ける場合の終了条件
 ⇒行番号は項目名行の2行目に固定し、列方向のみにカウンタ変数を使用【2】
●内側ループの終了条件を満たした時に、行カウンタを初期化。【7】
●内側ループを抜けた後に列カウンタをインクリメント【13】
●実行したい処理の後に行カウンタをインクリメント【11】

列ごとに処理を行う場合のセルの処理イメージはこんな感じ

f:id:Tompsom:20200314161819j:plain
列ごとに繰り返し処理


サンプルコードで使用する表は行ごとに処理を行う場合に使用したものと同様です

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

Sub 列ごとに繰り返し処理()

    Dim iGyouCnt           As Long     '行のカウンタ変数
    Dim iRetuCnt           As Long     '列のカウンタ変数

    Const RETU_KAISHI_PosX As Long = 3 '走査対象セルの最初の列番号
    Const KOUMOKUMEI_PosY  As Long = 2 '項目名の行番号
    Const GYOU_KAISHI_PosY As Long = 3 '走査対象セルの最初の行番号
    
    '< 外側のループ >
    '終了条件;3行目の「RETU_KAISHI_PosX + iRetuCnt」列目のセルの値が空白("")かどうか?
    '終了条件をチェックしながら、3行目「B3セル」から右方向へ走査する。
    '空白ではない間、【5】~【12】の処理を繰り返す。
    '終了条件を満たした場合の処理
    '    ⇒外側のループを抜ける(【3】)
    '    ⇒プロシージャを終了する【15】
    '大切なのは内側ループの列番号の指定と同じにすること。こうすることで、
    '    ①内側ループ終了条件(【6】)を満たして内側ループを抜け(【8】)、
    '    ②行カウンタがインクリメント(【13】)された時点で、走査対象のセルが1行下に移動する
    '    ③移動した1行下のセルが空白セルなら(【2】)、外側の繰り返し処理も抜けることができる。
    
    Do While (1)  '【1】
        If Worksheets("Sheet1").Cells(KOUMOKUMEI_PosY, RETU_KAISHI_PosX + iRetuCnt).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】
                    '列ごとに処理をしたいので、終端行まで移動したら、行カウンタを初期化することで、3行目に戻す
                    iGyouCnt = 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   >>>
                
                '列ごとに処理をしたいので、内側のループは行をインクリメントしながら進む
                iGyouCnt = iGyouCnt + 1  '【11】
                
            Loop  '【12】

        '列ごとに処理をしたいので、内側ループを抜けたら列カウンタをインクリメント
        iRetuCnt = iRetuCnt + 1  '【13】
        
        Loop  '【14】

End Sub