Excel VBAにおけるプログラミングでは、一時的に複数のデータを保存し、あとでまとめて処理したい場面がよくあります。こういった場合、非常に便利なのが Collection(コレクション) というオブジェクトです。
〇Collectionとは?
Collection は、VBAにおいて「複数の値やオブジェクトを一つの入れ物にまとめることができる」非常に柔軟な構造です。
Collectionの主な特徴:
順番付きでデータを格納できる(配列のように順にアクセス可能)
.Add メソッドで値を追加し、For
Each 構文で順に取り出せる
要素数が増えても柔軟に扱える(配列と違ってサイズ指定不要)
オブジェクトや配列など、複数項目のセットを一つにまとめられる
これにより、例えば「特定条件に一致する行のデータを一時保存し、後でまとめて出力したい」といった処理がとても簡潔かつ効率的に実現できます。
〇処理の概要:商品Aと商品Bのデータ抽出
今回扱うサンプルは、次のような処理を行います。
A列(A1:A10)から「商品A」「商品B」に一致するセルを検索
該当行のA列・B列・C列のデータを配列に格納
その配列を Collection に追加
収集したデータを、E列~G列に1行ずつ出力
〇処理の流れとコード解説
① 変数・範囲の準備と初期化
Dim a As Collection
Dim gg As Range
Dim c As Range
Dim i As Integer
Dim temp(5) As Variant
Range("d1:f17").ClearContents
Set gg = Range("A1:A10")
a:Collection型の変数(データの一時保存用)
temp:一行分のデータを入れる配列
gg:検索対象範囲(A1~A10)
処理前にD~F列の内容はクリアしています。
② 商品Aの検索とデータ収集
Set a = New Collection
For Each c In gg
If c.Value = "商品A" Then
temp(1) = c.Value
temp(2) = c.Offset(0, 1).Value
temp(3) = c.Offset(0, 2).Value
a.Add Array(temp(1), temp(2), temp(3))
End If
Next
A列で「商品A」と一致するセルを探し、その行のA~C列のデータを収集
.Offset(0, 1) でB列、.Offset(0, 2) でC列の値を取得しています
Array(...) で毎回新しい配列を作成し、Collectionに追加しています
ポイント:
VBAでは、同じ配列を繰り返し使って
Collection.Add すると、最後の値で上書きされた内容が重複して保存されてしまうという落とし穴があります。そのため、Array(...) を使って毎回新しい配列を作成することが非常に大切です。
③ 商品Aのデータ出力
i = 1
For Each h In a
Range("e" & i).Value = h(0)
Range("f" & i).Value = h(1)
Range("g" & i).Value = h(2)
i
= i + 1
Next
Collectionの各要素(配列)を順に取り出し、E〜G列に書き込み
h(0)、h(1)、h(2) はそれぞれ A列・B列・C列の値です
④ 商品Bのデータも同様に処理
Set a = New Collection
For Each c In gg
If c.Value = "商品B" Then
temp(1) = c.Value
temp(2) = c.Offset(0, 1).Value
temp(3) = c.Offset(0, 2).Value
a.Add Array(temp(1), temp(2), temp(3))
End If
Next
For Each h In a
Range("e" & i).Value = h(0)
Range("f" & i).Value = h(1)
Range("g" & i).Value = h(2)
i
= i + 1
Next
「商品B」の処理では、Collection
a をいったん New Collection で初期化し、同じ手順で該当データを収集・出力しています。これにより、「商品A」と「商品B」のデータが連続してE列から下に並ぶ形式で出力されます。
〇全体のサンプルコード(完成版)
Sub CollectAndOutputData()
Dim a As Collection
Dim gg As Range
Dim c As Range
Dim i As Integer
Dim temp(5) As Variant
Range("d1:f17").ClearContents
Set gg = Range("A1:A10")
i
= 1
'
商品Aの処理
Set a = New Collection
For Each c In gg
If c.Value = "商品A" Then
temp(1) = c.Value
temp(2) = c.Offset(0, 1).Value
temp(3) = c.Offset(0, 2).Value
a.Add Array(temp(1), temp(2), temp(3))
End If
Next
For Each h In a
Range("e" & i).Value = h(0)
Range("f" & i).Value = h(1)
Range("g" & i).Value = h(2)
i = i + 1
Next
'
商品Bの処理
Set a = New Collection
For Each c In gg
If c.Value = "商品B" Then
temp(1) = c.Value
temp(2) = c.Offset(0, 1).Value
temp(3) = c.Offset(0, 2).Value
a.Add Array(temp(1), temp(2), temp(3))
End If
Next
For Each h In a
Range("e" & i).Value = h(0)
Range("f" & i).Value = h(1)
Range("g" & i).Value = h(2)
i = i + 1
Next
End Sub
とで、より拡張性の高い処理も構築できます。
〇まとめ
今回紹介したVBAコードでは、Collection
を利用することで、特定の条件に一致するデータを一時的に保存し、後からまとめて別の場所に出力するという処理を効率的に実現しています。特に注目すべき点は、配列と Collection を併用することで、1行単位のデータセットを柔軟に管理できる点にあります。また、Array(...) を用いて毎回新しい配列を生成することで、データの上書きや意図しない参照トラブルを防ぐ工夫も施されています。
このような仕組みは、商品コードやカテゴリに応じたデータ分類、複数条件によるフィルタリング、さらには複数のシートにまたがるデータの収集・整理など、実務におけるさまざまな場面に応用可能です。たとえば、特定の取引先に関するデータだけを抽出してレポート化する、あるいは入力されたデータを分類して別々のリストに仕分けるといった用途にも適しています。
さらに柔軟性を持たせたい場合には、Collection に加えて Dictionary を使い、キーによるデータのグルーピングや重複排除を行う方法もあります。今回のコードは、こうした応用への第一歩として、VBAによるデータ処理の基礎的な考え方を学ぶ上でも非常に有効なサンプルといえるでしょう。
0 件のコメント:
コメントを投稿