VBA

<実務で必須!>For each文の使い方(コピペOK)

記事内に商品プロモーションを含む場合があります

このページでわかること

For each文の使い方と実用例がわかります。

覚えること

  1. For each文の使い方
    ブック内のシートそれぞれに処理する方法
    エクセルの特定のセル範囲内にそれぞれ処理する方法
    Dictionaryオブジェクトにキーとアイテムをそれぞれ格納、取り出す方法

こんにちは、hokkyokunです。
実務では必須のテクニックFor each文をご紹介します。
これが使えるかどうかで事務処理能力は大きく変わってきます!
それではやっていきましょう。

For each文

構文:For each 要素 in コレクションや配列
               処理
      next

文字で起こすとわかりにくいですが、
例えばブックにあるシート全部に何か処理をしたい場合や、
配列の要素一つ一つを取り出して何かしたいときに使います。

要素は変数を使用します。
例えばシートを処理したい場合は

Dim ws As Worksheet

みたいな感じで変数を宣言する必要があります。

コレクションとはオブジェクトの塊です。
例えばワークブックの中のワークシートコレクションとは
ブックの中にあるシート全てのことを指します。

ワークシートコレクションの例文(コピペOK)

例えばブックをこんな感じでシートを作ったとします。

シートを5つ作りました。

このシートから「このシートは残す1」と「このシートは残す2」だけ残し、他は削除するプログラムを作ってみようと思います。

Sub foreach_worksheetDelete()

'ワークシートの変数宣言
Dim ws As Worksheet

'For each文でシートを全て処理
For Each ws In ThisWorkbook.Worksheets
    
    Application.DisplayAlerts = False '警告を非表示にする
    
        'シートの名前が「このシートは残す1」と「このシートは残す2」ではないとき削除
        If ws.Name <> "このシートは残す1" And ws.Name <> "このシートは残す2" Then
            ws.Delete
        End If
    Application.DisplayAlerts = True '警告を表示する
Next
End Sub

このプログラムはよく使います。
シート名を変えればコピペでOKですので使ってください。

セルの値を一つ一つ処理(コピペOK)

次はセルに直接書かれた値を一つ一つ処理する方法です。
これもよく使います。

こんな感じでシートに値を入力していたとします。

Sub foreach_レンジコレクション()

Dim r As Range 'For each文で使う変数
Dim Rngs As Range 'For each文で処理するレンジコレクション

'=======================================================================
'Rngsの範囲を変えてください
'=======================================================================
Set Rngs = ThisWorkbook.Worksheets(1).Range("A2:A5") 'レンジコレクションのセット

'For each文でセルを一つ一つ処理する
For Each r In Rngs
    '=====================================
    'ここにさせたい処理を書いてください
    '=====================================
    Debug.Print r.Value
    
    
Next
End Sub

Dictionaryオブジェクトの例文(コピペOK)

Dictionaryオブジェクトは過去にご紹介しましたが、
大事なので改めて例文を作りました。

Sub foreach_Dictionaryオブジェクト()

'For each文で使う変数、dictionaryの場合はVariant型にしないとエラー
Dim l As Variant

Dim dic As New Dictionary 'Dictionaryオブジェクトの宣言

'=======================================================================
'Dictionaryオブジェクトに格納
'格納する内容を変えてください
'=======================================================================
dic.Add "A2", "リンゴ"
dic.Add "A3", "バナナ"
dic.Add "A4", "ナシ"
dic.Add "A5", "ブドウ"

'For each文でDictionaryオブジェクトの要素を一つ一つ処理
For Each l In dic
    '=====================================
    'ここにさせたい処理を書いてください
    '=====================================
    Debug.Print l & ":" & dic.Item(l)
    
Next
End Sub

ちなみにFor each文をうまく組み合わせればこのようになります。

Sub foreach_RangeプラスDictionary()

'Range用の変数の用意と格納範囲をセット
Dim r As Range
Dim Rngs As Range
Set Rngs = ThisWorkbook.Worksheets(1).Range("A2:A5") 'レンジコレクションのセット

'Dictionary用の変数とDictionaryオブジェクト
Dim l As Variant
Dim dic As New Dictionary

'Dictionaryオブジェクトに格納
For Each r In Rngs
    dic.Add r.Address, r.Value
Next

'Dictionaryの要素を取り出す
For Each l In dic
    Debug.Print l & ":" & dic.Item(l)
Next
End Sub

要素数が少ないのでコード数はあまり変わらないですが、
要素が増えると明らかにこちらの方がコンパクトになりますし、
何よりかっこいいです

実務ですぐ使えるものばかりです。
僕も現役でこれらを使っています。
よかったらあなたが普段やっている作業に使ってみてください。

ではでは