このページでわかること
覚えること
- For each文の使い方
ブック内のシートそれぞれに処理する方法
エクセルの特定のセル範囲内にそれぞれ処理する方法
Dictionaryオブジェクトにキーとアイテムをそれぞれ格納、取り出す方法
こんにちは、hokkyokunです。
実務では必須のテクニックFor each文をご紹介します。
これが使えるかどうかで事務処理能力は大きく変わってきます!
それではやっていきましょう。
For each文
構文:For each 要素 in コレクションや配列 処理 next
文字で起こすとわかりにくいですが、
例えばブックにあるシート全部に何か処理をしたい場合や、
配列の要素一つ一つを取り出して何かしたいときに使います。
要素は変数を使用します。
例えばシートを処理したい場合は
Dim ws As Worksheet
みたいな感じで変数を宣言する必要があります。
コレクションとはオブジェクトの塊です。
例えばワークブックの中のワークシートコレクションとは
ブックの中にあるシート全てのことを指します。
ワークシートコレクションの例文(コピペOK)
例えばブックをこんな感じでシートを作ったとします。
このシートから「このシートは残す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
要素数が少ないのでコード数はあまり変わらないですが、
要素が増えると明らかにこちらの方がコンパクトになりますし、
何よりかっこいいです
実務ですぐ使えるものばかりです。
僕も現役でこれらを使っています。
よかったらあなたが普段やっている作業に使ってみてください。
ではでは