タイトルのテキスト
タイトルのテキスト
タイトルのテキスト
タイトルのテキスト

Excel VBAでCollectionを使ったデータ処理の基本と応用

VBA

t f B! P L

gurafu

Excel VBAにおけるプログラミングでは、一時的に複数のデータを保存し、あとでまとめて処理したい場面がよくあります。こういった場合、非常に便利なのが Collection(コレクション) というオブジェクトです。

 この記事では、Collectionの基本的な使い方を踏まえつつ、A列のデータから特定の商品(「商品A」や「商品B」)を検索して対応する情報を抽出・出力する処理を例に、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")

aCollection型の変数(データの一時保存用)

 

temp:一行分のデータを入れる配列

 

gg:検索対象範囲(A1A10

 

処理前にDF列の内容はクリアしています。

 

② 商品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」と一致するセルを探し、その行のAC列のデータを収集

 

.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の各要素(配列)を順に取り出し、EG列に書き込み

 

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によるデータ処理の基礎的な考え方を学ぶ上でも非常に有効なサンプルといえるでしょう。

 

koneka1208

koneka1208

自己紹介

自分の写真
エクセル好きの窓際会社員です。 エクセルの操作法や日々の会社で得た知見などを発信していきます。 よろしくお願いします。

ブログ アーカイブ

連絡フォーム

名前

メール *

メッセージ *

QooQ