【Excel】VBAのFor Eachで全行・全シートをループ処理する方法

【Excel】VBAのFor Eachで全行・全シートをループ処理する方法
🛡️ 超解決

ExcelVBAを使って、複数のシートやセル範囲に同じ処理を適用したいと感じている方もいるでしょう。

手作業での繰り返しは時間がかかり、ヒューマンエラーの原因にもなりがちです。

この記事では、VBAのFor Eachループを活用し、これらの作業を効率的に自動化する方法を具体的に解説します。

【要点】VBAのFor Eachループで繰り返し処理を自動化するポイント

  • For Each Cell In Range: 指定したセル範囲の各セルに対して処理を実行し、個別のデータ操作を効率化します。
  • For Each Row In Range.Rows: 指定した範囲の各行に対して処理を実行し、行単位のデータ整理や条件判定を自動化します。
  • For Each ws In Worksheets: 作業中のブック内のすべてのシートに対して処理を実行し、複数のシートにまたがる集計やフォーマット変更を効率化します。

ADVERTISEMENT

VBAのFor Eachループとは?繰り返し処理の効率化

VBAのFor Eachループは、コレクション内の各オブジェクトに対して繰り返し処理を行う構文です。これにより、オブジェクトの数を事前に特定することなく処理を適用できます。

例えば、ワークシートコレクション内のすべてのワークシートや、特定の範囲内のすべてのセルなどが処理対象です。手作業でのコピーアンドペーストや、同じ処理の繰り返しをVBAコードで自動化し、作業時間を大幅に短縮できます。

For Eachループの基本的な構文

For Eachループの基本的な書き方は次の通りです。

For Each 要素変数 In コレクション
実行する処理
Next 要素変数

この構文により、コレクション内の各要素に順次アクセスし、指定された処理を実行します。要素変数はコレクション内の各要素を一時的に格納する変数です。

Forループとの使い分け

VBAにはForループとFor Eachループの2種類の繰り返し構文があります。

Forループは数値のインデックスを使って繰り返し処理を行うのに対し、For Eachループはコレクション内の各オブジェクトに直接アクセスします。コレクションの要素数が変動する場合や、特定の要素に順にアクセスしたい場合にFor Eachが適しています。

例えば、シートを削除するような操作でコレクションの要素数が変化する場合、For Eachループは予期しないエラーの原因になることがあります。その際はForループを使用するのが安全です。

お探しの解決策が見つからない場合は、こちらの「Excelトラブル完全解決データベース」で他のエラー原因や解決策をチェックしてみてください。

VBAのFor Eachループで全行・全シートを処理する手順

ここでは、For Eachループを使ってExcelのセル、行、シートを処理する具体的な手順を解説します。

VBAコードの記述に必要な準備

  1. 開発タブを表示する
    Excelのファイルタブをクリックし、「オプション」を選びます。「リボンのユーザー設定」から「開発」チェックボックスをオンにして「OK」をクリックします。
  2. VBEを起動する
    開発タブの「Visual Basic」をクリックしてVBAエディターを起動します。
  3. 標準モジュールを挿入する
    VBEのメニューから「挿入」→「標準モジュール」を選びます。表示された白いウィンドウにVBAコードを記述します。

For Eachで特定のセル範囲をループする

指定したセル範囲内の各セルに順番にアクセスし、処理を行う方法です。

  1. コードを記述する
    標準モジュールに以下のVBAコードを記述します。
    Sub セル範囲をループする()
    Dim TargetRange As Range
    Dim Cell As Range

    ' 処理対象となるセル範囲を設定します
    Set TargetRange = ActiveSheet.Range("A1:C10")

    ' TargetRange内の各セルに対して処理を実行します
    For Each Cell In TargetRange
    ' ここにセルごとの処理を記述します
    ' 例: セルの値が空白であれば「空白」と入力します
    If IsEmpty(Cell.Value) Then
    Cell.Value = "空白"
    End If
    Next Cell

    MsgBox "セル範囲の処理が完了しました。"
    End Sub
  2. マクロを実行する
    VBEのツールバーにある「実行」ボタン、またはExcelの開発タブから「マクロ」を選び、「セル範囲をループする」を実行します。

このコードは、シートのA1セルからC10セルまでの範囲を対象に、空白のセルがあれば「空白」というテキストを入力します。

For Eachでシートの全行をループする

現在アクティブなシートのデータがあるすべての行に対して処理を行う方法です。

  1. コードを記述する
    標準モジュールに以下のVBAコードを記述します。
    Sub 全行をループする()
    Dim TargetRow As Range
    Dim LastRow As Long

    ' データがある最終行を取得します
    LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

    ' 1行目から最終行までの各行に対して処理を実行します
    For Each TargetRow In ActiveSheet.Range("A1:A" & LastRow).Rows
    ' ここに行ごとの処理を記述します
    ' 例: A列の値が「完了」であれば、その行のB列に「OK」と入力します
    If TargetRow.Cells(1, 1).Value = "完了" Then
    TargetRow.Cells(1, 2).Value = "OK"
    End If
    Next TargetRow

    MsgBox "全行の処理が完了しました。"
    End Sub
  2. マクロを実行する
    VBEのツールバーにある「実行」ボタン、またはExcelの開発タブから「マクロ」を選び、「全行をループする」を実行します。

このコードは、アクティブシートのA列の最終行までを対象に、A列の値が「完了」の行があれば、その行のB列に「OK」と入力します。

For Eachでブック内の全シートをループする

作業中のブックに含まれるすべてのワークシートに対して処理を行う方法です。

  1. コードを記述する
    標準モジュールに以下のVBAコードを記述します。
    Sub 全シートをループする()
    Dim ws As Worksheet

    ' このブック内のすべてのワークシートに対して処理を実行します
    For Each ws In ThisWorkbook.Worksheets
    ' ここにシートごとの処理を記述します
    ' 例: 各シートのA1セルにシート名を入力します
    ws.Range("A1").Value = ws.Name

    ' 特定のシートを除外する例 (シート名が「集計」の場合、処理をスキップします)
    ' If ws.Name <> "集計" Then
    ' ws.Range("A1").Value = ws.Name
    ' End If
    Next ws

    MsgBox "全シートの処理が完了しました。"
    End Sub
  2. マクロを実行する
    VBEのツールバーにある「実行」ボタン、またはExcelの開発タブから「マクロ」を選び、「全シートをループする」を実行します。

このコードは、ブック内の各シートのA1セルにそのシート名を入力します。コメントアウトされた行のように、特定のシートを除外する条件を追加することもできます。

VBAのセキュリティ警告への対処

VBAコードを含むExcelファイルを開くと、セキュリティ警告が表示されることがあります。

これは悪意のあるマクロからPCを保護するための機能です。信頼できる発行元からのファイルであることが確認できれば、「コンテンツの有効化」ボタンをクリックしてマクロを有効にできます。

繰り返し利用するファイルの場合は、そのファイルを保存しているフォルダーを「信頼できる場所」に登録することで、警告が表示されなくなります。

  1. 信頼できる場所に登録する
    Excelのファイルタブをクリックし、「オプション」を選びます。「トラストセンター」→「トラストセンターの設定」→「信頼できる場所」へと進みます。
  2. 新しい場所を追加する
    「新しい場所の追加」をクリックし、マクロ有効ファイルを保存しているフォルダーパスを入力します。「この場所のサブフォルダーも信頼する」にチェックを入れ「OK」をクリックします。

For Eachループ利用時の注意点とトラブル対処法

For Eachループを効果的に使うための注意点と、よくあるトラブルの対処法を解説します。

オブジェクトの型が一致しないとエラーになる

For Eachループでは、要素変数の型がコレクション内の要素の型と一致している必要があります。例えば、ワークシートコレクションをループする際に、要素変数をRange型で宣言するとエラーが発生します。

原因:要素変数の型がコレクションの要素型と異なることが根本的な原因です。

対処:Dim ws As Worksheetのように適切な型を宣言しましょう。VBAでは変数を宣言する際に、処理対象となるオブジェクトの型を正確に指定することが重要です。

想定外のシートやセルが処理対象になってしまう

ActiveSheetUsedRangeを使用すると、VBA実行時にアクティブになっているシートや、データが入力されている範囲が対象となります。これは意図しないシートや範囲を処理してしまう原因になります。

原因:対象範囲を曖昧に指定しているため、VBAの実行環境によって結果が変わってしまうことです。

対処:ThisWorkbook.Worksheets("シート名")Sheets("Sheet1").Range("A1:C10")のように、ブック、シート、範囲を明示的に指定しましょう。これにより、常に同じ範囲が処理対象となります。

Excel2019/2021での挙動の違い

VBAのFor Eachループの基本的な挙動は、Excel for Microsoft 365とExcel2019、Excel2021で大きな違いはありません。しかし、一部の新しいExcel機能に対応したオブジェクトやメソッドが、古いバージョンでは利用できない場合があります。

例えば、新しいタイプのチャートやデータ型に関するオブジェクトは、最新版のExcelで導入されたものです。そのため、特定の機能に依存するコードを書く際は、互換性を考慮する必要があります。

対処:特定のバージョンでしか動作しない機能を利用する場合は、コメントで注意書きを残す、またはバージョンごとの分岐処理を実装すると良いでしょう。

ADVERTISEMENT

ForループとFor Eachループの比較

ここでは、VBAの繰り返し処理で使われるForループとFor Eachループの主な違いを比較します。

項目 Forループ For Eachループ
用途 数値インデックスで指定回数繰り返す場合 コレクション内の要素を順に処理する場合
処理対象 指定したインデックス範囲内の要素 コレクション内のすべての要素
コード記述 インデックスの開始値と終了値を指定 コレクションと要素変数を指定
柔軟性 要素の削除や追加による影響を受けやすい 要素の増減に強く、コード変更が少ない
要素の削除 ループ中に要素を削除可能(インデックス調整が必要) ループ中に要素を削除するとエラーになることがある

まとめ

この記事では、VBAのFor Eachループを使い、Excelの全行・全シートを効率的に処理する方法を解説しました。

特定のセル範囲、全行、そして全シートに対する繰り返し処理を自動化できるようになります。

今日からFor EachループをVBAコードに活用し、データ処理をさらに効率化していきましょう。

📊
Excelトラブル完全解決データベースこの記事以外にも、様々なエラー解決策をまとめています。困った時の逆引きに活用してください。

ADVERTISEMENT

この記事の監修者
📈

超解決 Excel・Word研究班

企業のDX支援や業務効率化を専門とする技術者チーム。20年以上のExcel・Word運用改善実績に基づき、不具合の根本原因と最短の解決策を監修しています。ExcelとWordを使った「やりたいこと」「困っていること」「より便利な使い方」をクライアントの視点で丁寧に提供します。

🏆
超解決 Excel検定 あなたのExcel実務能力を3分で測定!【1級・2級・3級】