For文 VBAテクニック集 VBA一覧 文法・構文

【VBA】For Nextを2つ(複数)同時に使用する方法|二重ループを安全に使いこなす実務設計

VBAでデータ処理を行っていると、
「行と列を同時に処理したい」
「2つのリストを照合したい」
「表全体を一括で確認したい」
といった場面に必ず遭遇します。

このようなときに必要になるのが、
For Nextを2つ以上同時に使用する“二重ループ(ネスト)” です。

しかし実務では、

「処理が遅くなった」
「どこで止まっているのか分からない」
「修正したら壊れた」

といったトラブルが非常に多く発生します。

これは、
For Nextを2つ使うこと自体が危険なのではなく、設計が曖昧なまま使っていること が原因です。

この記事では、

  • For Nextを2つ同時に使う基本
  • 実務で最も多い使用パターン
  • 安全な設計方法
  • よくある失敗と対策

まで、
実務で壊れないループ設計 を前提に分かりやすく解説します。

✅ VBA For Nextを2つ同時に使用する基本|二重ループ(ネスト)とは

For Nextを2つ同時に使用することは、VBAではごく一般的な処理です。
しかし、「ネスト=難しい」「処理が重くなる」というイメージだけで敬遠されることも少なくありません。
実際には、適切に設計すれば非常に安定した処理になります。
問題の多くは、ループの目的が曖昧なまま追加されてしまうことにあります。
特に後から機能を追加した結果、ループが増え、処理の流れが見えなくなるケースは典型的です。
そのため、まずは「なぜ2つ必要なのか」を明確にすることが重要です。
ここを理解しておかないと、将来の修正や引き継ぎで必ず困ることになります。

・二重ループの基本構文:For Nextを2つ使用する例

Sub SampleDoubleLoop()

    Dim rowIndex As Long
    Dim columnIndex As Long
    
    For rowIndex = 1 To 3
    
        For columnIndex = 1 To 3
        
            Debug.Print "行:" & rowIndex & " 列:" & columnIndex
            
        Next columnIndex
        
    Next rowIndex

End Sub

・ なぜこの書き方にしているのか

このコードでは、

外側:行(rowIndex)
内側:列(columnIndex)

という役割を明確にしています。

ここが曖昧だと、

  • 処理の意味が分からない
  • 修正時に壊れる
  • 他人が理解できない

という問題が発生します。

・ 実務で最も重要なポイント

最初に決めるべきこと:

「何を基準にループするのか」

です。

二重ループを正しく使うためには、「どの行まで処理するのか」を正確に指定することが非常に重要です。
行の指定方法や最終行の取得方法を改めて整理しておきたい方は、【VBA】Rowsの基本的な使い方|行指定・複数行・最終行取得まで解説の記事も参考にしてください。


✅ VBA 二重ループの実務例|行と列を同時に処理する方法

実務で最も多いのは、表全体を確認する処理です。
例えば、空白チェック、数値確認、データ検証などです。
このような処理では、行だけ、または列だけでは不十分になります。
そのため、表全体を対象にした二重ループが必要になります。
ここで設計を誤ると、処理速度が低下したり、誤判定が発生することがあります。
特に大量データを扱う場合は、最初の設計が結果を大きく左右します。
ここでは、最も基本となる実務パターンを紹介します。

・表全体を確認する処理の例:セルの空白チェック

Sub CheckEmptyCells()

    Dim rowIndex As Long
    Dim columnIndex As Long
    
    Dim lastRow As Long
    Dim lastColumn As Long
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    lastColumn = Cells(1, Columns.Count).End(xlToLeft).Column
    
    For rowIndex = 1 To lastRow
    
        For columnIndex = 1 To lastColumn
        
            If Cells(rowIndex, columnIndex).Value = "" Then
            
                Debug.Print "空白セル:" & rowIndex & "," & columnIndex
                
            End If
            
        Next columnIndex
        
    Next rowIndex

End Sub

・ なぜこの書き方にしているのか

この設計では、

最終行・最終列を事前に取得

しています。

これは非常に重要です。

理由:

  • 不要なセルを処理しない
  • 処理速度が安定する
  • エラーを防げる

・ 実務での活用例

このパターンは次のような業務で使われます。

  • 入力漏れチェック
  • 数値チェック
  • データ整合性確認
  • CSVデータ検証
  • 帳票チェック

二重ループを実務で使うときは、すべてのデータを処理するのではなく、「条件に合わないデータを安全にスキップする」設計が非常に重要になります。
空白セルを検出したときに次の処理へ進む方法や、壊れにくい条件分岐の考え方については、【VBA】IF文で空白なら次の処理をさせる方法|スキップ処理と安全な条件分岐を実務目線で解説の記事も参考にしてください。


✅ VBA 二重ループで最も多い用途|2つのリストを照合する方法

実務では、
「2つのリストを比較する」
処理が非常に多く登場します。

例えば:

  • 顧客リストと注文リスト
  • 商品マスタと在庫データ
  • 社員一覧と勤怠データ

このような場面では、
1つのリストをもう1つのリストと照合する必要があります。
ここで二重ループが必要になります。
ただし、この処理は設計を誤ると非常に遅くなるため注意が必要です。

・2つのリストを照合する例:一致データの確認

Sub CompareLists()

    Dim sourceRow As Long
    Dim targetRow As Long
    
    Dim lastSourceRow As Long
    Dim lastTargetRow As Long
    
    lastSourceRow = Cells(Rows.Count, 1).End(xlUp).Row
    lastTargetRow = Cells(Rows.Count, 2).End(xlUp).Row
    
    For sourceRow = 2 To lastSourceRow
    
        For targetRow = 2 To lastTargetRow
        
            If Cells(sourceRow, 1).Value = Cells(targetRow, 2).Value Then
            
                Debug.Print "一致:" & Cells(sourceRow, 1).Value
                
            End If
            
        Next targetRow
        
    Next sourceRow

End Sub

・ なぜこの書き方にしているのか

この設計では、

外側:基準データ
内側:検索対象

という役割を明確にしています。

これは非常に重要です。

・ 別の書き方との比較

よくある誤り:

  • 役割が曖昧
  • 変数名が意味不明
  • ループ順序が逆

これらは、

バグの温床

になります。


✅ VBA 二重ループでよくある失敗|処理が遅くなる原因

二重ループは便利ですが、
設計を誤ると処理速度が急激に低下します。
特にデータ量が増えたときに問題が表面化します。
小さなデータでは正常に動いていても、
本番環境で突然遅くなることは珍しくありません。
この原因の多くは、不要な処理を繰り返していることです。
ここでは、典型的な失敗パターンを整理します。
これを理解しておくことで、多くのトラブルを未然に防ぐことができます。

・失敗例:毎回セルを検索している

For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row

これは危険です。


・ 理由

このコードは、

毎回最終行を再計算

しています。

・ 正しい書き方

lastRow = Cells(Rows.Count, 1).End(xlUp).Row

・ 実務で最重要ポイント

必ず:

ループ前に値を取得する

二重ループの処理が遅くなる原因のひとつは、必要な条件を満たしてもループを続けてしまうことです。
条件を満たした時点でループを安全に終了する方法や、無駄な処理を防ぐ設計については、【VBA】For文:二重ループから抜ける方法の記事も参考にしてください。


✅ VBA 二重ループを安全に設計するためのルール

二重ループは強力ですが、
無秩序に増えると一気に管理が難しくなります。
特に保守や引き継ぎの場面では、
ループ構造が理解できないことが最大のリスクになります。
そのため、最初から設計ルールを持つことが重要です。
これは技術というより、運用の問題です。
ここでは、実務で守るべき基本ルールを整理します。
このルールを守るだけで、多くのトラブルを防ぐことができます。

・安全な二重ループ設計の基本ルール

  • 変数名は役割が分かる名前にする
  • 最終行・最終列は事前に取得する
  • ループの役割を明確にする
  • ネストは最小限にする
  • コメントで目的を書く

・ 最も重要な考え方

ループは増やす前に設計する


✅VBAとの連携:二重ループを減らすという選択肢

実務では、

「二重ループをどう書くか」

よりも、

「二重ループを減らせるか」

の方が重要になることがあります。

例えば:

  • 配列を使う
  • Dictionaryを使う
  • Findを使う
  • AutoFilterを使う

これらを活用すると、

処理速度が大幅に改善することがあります。

つまり、

二重ループは便利だが万能ではない

という理解が重要です。


 

✅ まとめ:For Nextを2つ同時に使うときは設計がすべて

  • For Nextを2つ使うこと自体は危険ではない
  • 役割を明確にすれば安全に使える
  • 最終行・最終列は必ず事前取得する
  • 変数名は意味が分かるものにする
  • 設計を誤ると処理速度が大幅に低下する
  • 場合によっては別の方法を検討する

そして最も重要なのは、

「ループを書く前に目的を決める」

ことです。

この考え方を身につけることで、
将来の修正や仕様変更にも強い、
壊れにくいVBAコードを書くことができるようになります。

    -For文, VBAテクニック集, VBA一覧, 文法・構文