【VBAリファレンス】VBAスキルを飛躍させる二重ループ完全攻略:九九表からデータ照合までを極める

スポンサーリンク

概要

Excel VBAを習得する過程で、多くの学習者が「壁」と感じるのが二重ループ構造です。単一のループは「繰り返しの回数を指定する」という直感的な理解で済みますが、二重ループは「入れ子構造」の概念を理解しなければならず、ここを突破できるかどうかが、初級者から中級者へステップアップできるかどうかの分水嶺となります。本稿では、二重ループの論理的な組み立て方を深く掘り下げ、実務で頻出する「行列データの操作」や「データの突き合わせ」を題材に、圧倒的な品質のコードを記述するための考え方を解説します。

詳細解説:二重ループの論理的構造

二重ループとは、あるループの中に別のループが組み込まれている状態を指します。外側のループ(Outer Loop)が1回回る間に、内側のループ(Inner Loop)が一周すべてを完了するという仕組みです。

これを理解するための最良のメソッドは「時計の針」をイメージすることです。「時」が1時間進む間に、「分」は0から59まで一周します。この「時」にあたるのが外側ループ、「分」にあたるのが内側ループです。VBAにおいては、外側ループで「行」を制御し、内側ループで「列」を制御するというのが最も基本的なパターンとなります。

なぜ二重ループが必要なのか。それは、Excelという「2次元のグリッド」を操作するために必須だからです。セル範囲(Range)を走査する際、1行ずつ移動しながら、各行の中にある全列を確認する。この作業を自動化するために、二重ループは不可欠なツールとなります。

サンプルコード:九九表の作成とデータ照合

ここでは、二重ループの基礎となる「九九表」の生成と、実務でよく使う「2つのリストの突き合わせ」のサンプルを示します。


' サンプル1:九九表をアクティブシートに出力する
Sub CreateMultiplicationTable()
    Dim i As Integer, j As Integer
    
    ' 外側のループ:行(1から9)
    For i = 1 To 9
        ' 内側のループ:列(1から9)
        For j = 1 To 9
            ' セル(i, j)に計算結果を代入
            Cells(i, j).Value = i * j
        Next j
    Next i
End Sub

' サンプル2:A列とB列のデータを比較し、一致するものにフラグを立てる
Sub CompareTwoColumns()
    Dim i As Long, j As Long
    Dim lastRowA As Long, lastRowB As Long
    
    lastRowA = Cells(Rows.Count, 1).End(xlUp).Row
    lastRowB = Cells(Rows.Count, 2).End(xlUp).Row
    
    ' A列の各データに対して、B列の全データを照合する
    For i = 1 To lastRowA
        For j = 1 To lastRowB
            If Cells(i, 1).Value = Cells(j, 2).Value Then
                Cells(i, 3).Value = "一致"
                Exit For ' 一致した時点で内側のループを抜ける(効率化)
            End If
        Next j
    Next i
End Sub

このコードのポイントは、サンプル2における「Exit For」の使用です。二重ループは計算量が膨大になりやすいため、目的の結果が得られた時点で内側のループを即座に中断する「早期離脱」のテクニックは、プロフェッショナルのコードとしては必須の嗜みです。

実務アドバイス:パフォーマンスと可読性の向上

二重ループを実務で扱う際、最も注意すべきは「計算速度」です。特に数万行のデータを二重ループで処理しようとすると、プログラムがフリーズしたかのような状況に陥ることがあります。

1. 配列への格納(Array):セルを直接操作するのは非常に低速です。Rangeオブジェクトの値を一度Variant型の配列に格納し、メモリ上で二重ループを回すことで、処理速度は数十倍から数百倍に向上します。
2. ループ範囲の動的設定:`For i = 1 To 10000`のように数値をハードコーディングするのは避け、`LastRow`変数を用いて最終行を自動取得するようにしてください。
3. インデントの徹底:二重ループは可読性が低下しがちです。必ずインデント(タブによる字下げ)を行い、どこからどこまでがループの範囲であるかを視覚的に明確にしてください。
4. 処理の分離:内側のループで複雑な条件分岐を行いたい場合は、その処理を別のプロシージャ(SubやFunction)として切り出してください。これにより、メインのロジックが追いやすくなります。

まとめ

二重ループは、ただの「繰り返しの入れ子」ではありません。Excelという広大なキャンバスを、効率的に、そして正確に塗りつぶすための強力なエンジンです。最初は「外側のループが動いている間、内側のループがどう動くのか」を紙に書き出しながらトレースしてみてください。

変数の動きを一つずつ追うことで、プログラムの挙動が見えるようになってきます。この感覚を掴めば、複雑なデータ加工も「ループを何重にするか」「どのタイミングで抜けるか」という論理的なパズルとして解けるようになるはずです。ぜひ、今日から日々の業務で「自動化できる二重ループ」を探してみてください。その一歩が、あなたのVBAスキルを確実なものへと引き上げます。

タイトルとURLをコピーしました