エクセルVBAでコレクション化したインスタンスを取り出す方法


みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズでお送りしております。

前回の記事はこちら。

クラスから生成したインスタンスをコレクション化する方法についてお伝えしました。

エクセルVBAでインスタンスの集合をコレクション化する方法
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ連載をしております。今回は、エクセルVBAでCollectionオブジェクトを使ってインスタンスの集合をコレクション化する方法をお伝えします。

それで、コレクションにしたはいいのですが、そこから要素を取り出してクラスのメンバーを活用できるのかを説明していませんでしたね…

ということで、今回はエクセルVBAでコレクション化したインスタンスを取り出す方法についてお伝えします。

では、行ってみましょう!

前回のおさらい

では、まずおさらいから。

以下のようなエクセル表をクラスで管理するということを目指しています。

エクセルVBAでクラス化するエクセル表

そして、そのデータの1行分を表すPersonというクラスを以下のように作成しております。

プロパティ、メソッドと色々なメンバーが追加されていますね。

そして、エクセル表のデータからインスタンスを生成してコレクション化するという処理を作成しましたが、それが以下のModule1です。

myPersonというオブジェクト変数をコレクションとして、そこに生成したインスタンスに初期データを投入したものを、要素として追加していっています。

では、このコレクションmyPersonからインスタンスをどのように参照して、操作できるのか…これについて見ていきましょう。

Collectionオブジェクトから要素を取り出す

まず、Collectionオブジェクトから要素を取り出す方法を見ていきましょう。

インデックスを使う方法と、キーを使う方法の2種類を使用することができます。

インデックスを使う

Collectionオブジェクトの要素を取り出すには、Itemメソッドを使います。

書式はこちらのように、引数としてインデックスを指定します。

Collectionオブジェクト.Item(インデックス)

Itemメソッドは既定のメンバーなので、以下のように省略した記述をしてもOKです。

Collectionオブジェクト(インデックス)

例えば、以下のようにすれば、インデックスが2の要素を取り出して、そのFirstNameプロパティを出力できます。

ただ…どのインスタンスが、どのインデックスに対応しているか…別途記録しておかないとイマイチ分かりづらいですよね。

キーを使う

そこで、Collectionオブジェクトからキーを使って要素を取り出すという手があります。

ほら、myPersonsに要素を追加するときに、以下のようにインスタンス自身のIdプロパティをキーに設定していたのでした。

それで、CollectionオブジェクトのItemメソッドは引数として、キーを指定することもできます。

Collectionオブジェクト.Item(キー)

同様に、以下のように省略できます。

Collectionオブジェクト(キー)

誰がどのIdであるかは事前にわかっていますもんね。

以下のようにすれば、Idプロパティが「a03」のPersonオブジェクトのBirthdayプロパティを取得できます。

なお、Personクラスの仕様では、FirstNameプロパティとGenderプロパティ、Birthdayプロパティは変更が可能です。

キーを使って取り出して、プロパティを変更するということもできるわけですね。

ループを回して各インスタンスを操作する

コレクション化のもう一つのメリットとしては、反復を行うステートメントを使えるようになるということですね。

例えば、For Each~Next文を使えば、以下の構文で各要素についてループさせることができますね。

For Each 変数 In Collectionオブジェクト
 ’処理
Next 変数

今回の場合は、以下のようにすれば、各インスタンスのプロパティをデバッグ出力することができます。

コレクション化したインスタンスを取得する

では、以上を踏まえてマクロを実行して確認してみましょう。

まとめて、Module1を以下のように書き換えてみました。

実行すると、イミディエイトウィンドウには以下のように出力されます。

コレクション化したインスタンスの情報をデバッグ出力

まとめ

以上、エクセルVBAでコレクション化したインスタンスを取り出す方法をお伝えしました。

配列でもいいのですが、コレクションだとキーが使えるのがいいですよね。

あと、サイズを気にしなくていいですしね。

さて、次回はこのコレクション…もっと欲張って、独自のコレクション作りを進めていきます。

エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
「初心者でもわかるエクセルVBAのクラスモジュール」ということでシリーズでお伝えしております。今回は、エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法をお伝えします。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセルVBAでクラスを作ろう

名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!
  1. 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
  2. エクセルVBAでクラスに最も簡単なプロパティを追加する方法
  3. エクセルVBAで自作クラスをインスタンス化する方法
  4. エクセルVBAでクラスに最も簡単なメソッドを追加する方法
  5. エクセルVBAで表の1行分のデータを表すクラスを作成する方法
  6. エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
  7. エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
  8. エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
  9. エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法
  10. エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
  11. エクセルVBAでインスタンスの集合をコレクション化する方法
  12. エクセルVBAでコレクション化したインスタンスを取り出す方法
  13. エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
  14. エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
  15. エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法
  16. エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
  17. エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
  18. エクセルVBAで自作コレクションの要素を削除するメソッドの作り方
  19. エクセルVBAでエクセル表のデータを反映するメソッドとクラスを使うメリット

  投稿者プロフィール

タカハシノリアキ株式会社プランノーツ 代表取締役
株式会社プランノーツ代表、コミュニティ「ノンプロ研」主宰。1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ
★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ
★フォロー頂ければ嬉しいです。

コメント

タイトルとURLをコピーしました