【VBA】For Each…Next ステートメント|基本と応用テクニック

この記事では、ExcelのVBA(Visual Basic for Applications)で使用されるFor Each...Nextステートメントについて、基本から応用テクニックまで詳細に解説します。このステートメントは、Excelのワークシートやセルなど、オブジェクトの集まり(コレクション)に対して繰り返し処理を行う際に非常に便利です。この記事を通して、For Each...Nextの使い方を完全に理解し、効率的なコードを書けるようになることを目指します。

目次

For Each…Nextの基本概念

For Each…Nextはコレクションに対して使用

For Each...Nextは、コレクションと呼ばれるオブジェクトの集まりに対して使用されます。Excelのワークシートやセルなどがこれに該当します。

基本的な構文

For Each...Nextステートメントの基本的な構文は以下のようになります。

For Each element In group
    [statements]
    [Exit For]
    [statements]
Next [element]
  • element: コレクション内の個々のオブジェクトを指す変数です。
  • group: 処理対象となるコレクションを指します。
  • [statements]: 繰り返し処理で実行されるコードです。
  • [Exit For]: 条件に応じて繰り返しを中断するためのステートメントです。

[statements]について

[statements]は、For Each...Nextループ内で実行される一連のVBAコードです。この部分はループの中心となる処理を記述します。例えば、Excelの全てのワークシート名を出力する場合、Debug.Print ws.Nameがこの部分に該当します。

Dim ws As Worksheet
For Each ws In Worksheets
    Debug.Print ws.Name
Next ws

データ型とオブジェクト変数

elementのデータ型

elementに指定するオブジェクトには、データ型があります。一般的には、Variant型、Object型、固有オブジェクト型のいずれかが使用されます。固有オブジェクト型を指定することで、そのオブジェクトが持つプロパティやメソッドを効率的に利用できます。

オブジェクト変数の宣言と型指定

オブジェクト変数を宣言する際には、その型を明示的に指定することが一般的です。例えば、Excelのワークシートを操作する場合、以下のようにWorksheet型で変数を宣言します。

Dim ws As Worksheet
For Each ws In Worksheets
    ' ここでwsに対する処理を記述
Next ws

Exit Forの使用とその詳細

Exit Forは、特定の条件が満たされた場合にFor Each...Nextループを途中で終了するためのステートメントです。これは、不必要なループを避けるために非常に有用です。

Exit Forの使用例

以下はExit Forを使用した簡単な例です。この例では、ワークシート名が”Sheet1″であればループを抜け出します。

For Each ws In Worksheets
    If ws.Name = "Sheet1" Then
        Exit For
    End If
Next

コードサンプル

サンプル1:全てのワークシート名を出力する

コード

Sub ListAllWorksheetNames()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        Debug.Print ws.Name
    Next ws
End Sub

処理の流れ

  1. Dim ws As Worksheetで、ワークシートオブジェクトを格納する変数wsを宣言します。
  2. For Each ws In ThisWorkbook.Worksheetsで、現在のワークブック(ThisWorkbook)に含まれる全てのワークシート(Worksheets)に対して繰り返し処理を開始します。
  3. Debug.Print ws.Nameで、現在のワークシート(ws)の名前(Name)を出力します。
  4. Next wsで、次のワークシートに移動します。全てのワークシートを処理し終えると、ループが終了します。

サンプル2:特定のセル範囲(A1:C3)の値を2倍にする

コード

Sub DoubleCellValues()
    Dim cell As Range
    For Each cell In Worksheets("Sheet1").Range("A1:C3")
        cell.Value = cell.Value * 2
    Next cell
End Sub

処理の流れ

  1. Dim cell As Rangeで、セル範囲を格納する変数cellを宣言します。
  2. For Each cell In Worksheets("Sheet1").Range("A1:C3")で、”Sheet1″のA1からC3までのセル範囲に対して繰り返し処理を開始します。
  3. cell.Value = cell.Value * 2で、現在のセル(cell)の値を2倍にします。
  4. Next cellで、次のセルに移動します。指定した範囲の全てのセルを処理し終えると、ループが終了します。

サンプル3:特定のワークシート(”Sheet1″)が存在するか確認する

コード

Sub CheckWorksheetExists()
    Dim ws As Worksheet
    Dim sheetExists As Boolean
    sheetExists = False
    
    For Each ws In ThisWorkbook.Worksheets
        If ws.Name = "Sheet1" Then
            sheetExists = True
            Exit For
        End If
    Next ws
    
    If sheetExists Then
        MsgBox "Sheet1 exists."
    Else
        MsgBox "Sheet1 does not exist."
    End If
End Sub

処理の流れ

  1. Dim ws As WorksheetDim sheetExists As Booleanで、ワークシートオブジェクトと真偽値を格納する変数を宣言します。
  2. sheetExists = Falseで、sheetExistsを初期値Falseに設定します。
  3. For Each ws In ThisWorkbook.Worksheetsで、現在のワークブックに含まれる全てのワークシートに対して繰り返し処理を開始します。
  4. If ws.Name = "Sheet1" Thenで、ワークシート名が”Sheet1″かどうかを確認します。
  5. 名前が”Sheet1″であれば、sheetExists = Trueにして、Exit Forでループを終了します。
  6. If sheetExists Thenで、sheetExistsTrueFalseかに応じてメッセージボックスを表示します。

サンプル4:全てのワークシートのA1セルに”Hello”と入力する

コード

Sub WriteHelloToAllWorksheets()
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1").Value = "Hello"
    Next ws
End Sub

処理の流れ

  1. Dim ws As Worksheetで、ワークシートオブジェクトを格納する変数wsを宣言します。
  2. For Each ws In ThisWorkbook.Worksheetsで、現在のワークブックに含まれる全てのワークシートに対して繰り返し処理を開始します。
  3. ws.Range("A1").Value = "Hello"で、現在のワークシートのA1セルに”Hello”と入力します。
  4. Next wsで、次のワークシートに移動します。全てのワークシートを処理し終えると、ループが終了します。

For Each…Next ステートメントに関するFAQ

Q:For Each…Next ステートメントとは何ですか?

A:For Each…Next ステートメントは、VBA(Visual Basic for Applications)で使用される制御構造の一つです。このステートメントを使用すると、コレクションや配列の各要素に対して繰り返し処理を行うことができます。Excelのワークシートやセル、配列など、複数のオブジェクトに対して同じ操作を行いたい場合に非常に便利です。

Q:基本的な構文はどのようになりますか?

A:基本的な構文は以下のようになります。

For Each element In group
[statements]
Next [element]
    

ここで、elementはコレクション内の各オブジェクトを指す変数であり、groupは処理対象となるコレクションまたは配列です。[statements]は繰り返し処理で実行されるコードを指します。

Q:For Each…Next と For…Next の違いは何ですか?

A:For Each...Nextはコレクションや配列の各要素に対して繰り返し処理を行いますが、For...Nextは指定した回数だけ繰り返し処理を行います。For Each...Nextは要素の数が事前に不明な場合や、コレクション内のすべての要素に対して処理を行いたい場合に便利です。

Q:Exit For ステートメントは何ですか?

A:Exit Forステートメントは、For Each...Nextループを途中で終了するための命令です。特定の条件が満たされた場合にループを抜け出すことができます。

Q:オブジェクト変数のデータ型は何を指定すればよいですか?

A:オブジェクト変数(element)のデータ型は、処理対象となるコレクションや配列の要素の型に依存します。一般的には、Variant型、Object型、または固有のオブジェクト型(例:Worksheet、Rangeなど)が使用されます。

Q:For Each…Next はどのような場面でよく使用されますか?

A:ExcelのVBAでよく使用される場面としては、ワークシートの集合に対する操作、セル範囲に対する値の設定や取得、配列の要素に対する処理などがあります。

Q:For Each…Next でエラーが出る場合、どう対処すればよいですか?

A:エラーの原因は多岐にわたりますが、よくある問題としてはオブジェクト変数のデータ型が不正である、コレクションが空である、などが考えられます。エラーメッセージをよく読み、適切なデバッグ手法を用いて問題を解決してください。

関連動画

まとめ

この記事でFor Each...Nextステートメントの基本から応用までを詳細に解説しました。このステートメントを使いこなすことで、ExcelのVBAプログラミングがより効率的になります。特にコレクションやオブジェクト変数に対する処理が簡単になるため、ぜひこの知識を活用してください。

Excelのショートカットキーの練習

当サイトはショートカットキーの練習を実際の動きを確認しながら練習できる機能がついています。繰り返し指を動かして練習ができるので、ゲーム感覚で遊んでいくうちに自然とショートカットキーが使えるようになれます。ショートカットキーは暗記するよりも実際に手を動かして練習していったほうが習得が早くなるので、是非当サイトをブックマークに登録し定期的に練習してみてください。下記のSTARTキーを押下すると練習を始められます。

下のスタートボタンを押して練習モードに入ります。
STARTSTOP
※入力モード切り替え ctrl + shift + alt + space
PRE
NEXT
現在の問題をリストから除外
除外したリストをリセット
現在の除外状況のURL取得
コピー
ガイドモード
リピートモード

※推奨ブラウザ Google Chrome

PUSH ENTER
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次