エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法


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

「初心者でもわかるエクセルVBAのクラスモジュール」についてシリーズでお伝えしています。

前回の記事はこちら。

エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
「初心者でもわかるエクセルVBAのクラスモジュール」のシリーズです。今回はエクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initializeの使い方です。

インスタンスの生成時に自動で呼び出されるイベントプロシージャClass_Initializeについて紹介しました。

さて、そのClass_Initializeは自作のコレクションに追加したのですが、実はこのコレクションに初期データを投入する処理を追加もできちゃうんです。

ということで、今回はエクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法です。

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

前回のおさらい

では、これまでのおさらいから。

まず、以下のようなエクセル表があります。

このデータ群をクラスモジュールを使って表現したいんです。

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

エクセル表の1行分のデータを表すのが、以下のクラスPersonです。

エクセル表のデータを入れるプロパティや、それらを操作するメンバーを作りました。

そして、Personクラスから生成されたインスタンスを集合としてコレクション的に扱うのがこのクラスPersonsです。

これで複数のデータ行、すなわちエクセル表全体を扱うことができるわけです。

前回は、イベントプロシージャClass_Initializeを作成して、Itemsプロパティ用Collectionオブジェクトの生成とセットをするようにしました。

そして、その動作を確認するために作ったのが、以下の標準モジュールModule1のコードです。

今回の目標:自作コレクションの初期データを投入したい

さて、以前クラスPersonのインスタンスについて初期データを投入する処理を作るという記事を書きました。

エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
「初心者でもわかるエクセルVBAのクラスモジュール」についてシリーズでお伝えしています。今回は、エクセルVBAでクラスのインスタンス生成時にデータを簡単に格納する、つまりコンストラクタ的なメソッドを作る方法です。

その際は、Class_Initializeではなくて、独自のInitializeメソッドというのを作って、初期データの投入をするようにしていました。

上記のModule1のコードでいうと、10行目のところです。

これは、イベントプロシージャClass_Initializeには引数を渡すことができないという仕様から、仕方なく別メソッドにしていたんですね。

では、クラスPersonsはどうです?

クラスPersonは何行目のデータをインスタンス化していいかわからないので引数を渡す必要がありましたが、クラスPersonsは表全体をインスタンス化しちゃっていいですもんね。

引数、いらないんじゃないですかね…?

てことは、イベントプロシージャClass_Initializeにすべて吸収できるのでは…?

検証してみましょう!

イベントプロシージャClass_Initializeで初期データを投入する

標準モジュールModule1の4~14行目の処理をご覧ください。

4行目のCollectionオブジェクト生成とセットは、既にPersonsクラスのClass_Initializeに移設済みなので、コメントアウトしています。

残りの処理はどうでしょう。

  • 2行目からすべてのデータ行について
    • Personクラスのインスタンスを生成し変数pにセット
    • pについてセル範囲を渡してInitializeメソッドを実行、pに初期データをセット
    • myPersonsのItemsプロパティ(コレクション)にpを追加

引数なくても、いけそうです。

自作コレクションのクラスモジュール

では、初期データ投入の処理をクラスPersonsに作成していきます。

Personsクラスのコードを以下のように追加しました。

といっても、上記のModule1の処理のほぼカット&ペーストです。

変更したところと言えば、2行目と9行目。myPersons.Itemとなっていたところを、単にItemsとしただけですね。

自作コレクションへの初期データ投入を確認する

では、Personsクラスの初期データ投入について動作を確認してみましょう。

Module1のコードは以下のように変更しました。

…って、ものすごいシンプルになりましたね。

実行して、Stopステートメント中断時のローカルウィンドウを見てみましょう。

イベントプロシージャClass_Initializeで初期データを投入

まとめ

以上、エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法についてお伝えしました。

標準モジュール…だいぶスッキリしましたよね!

初期データ投入などといういつも発生する処理は、なるべくクラスモジュールのほうで持っていたいですもんね。

さて、では次回はPersonsクラスを操作するメンバーを追加していきますよ。

エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
「初心者でもわかるエクセルVBAのクラスモジュール」というテーマでシリーズ連載をしております。今回は、エクセルVBAで自作コレクションの要素を取得するItemプロパティの作り方をお伝えします。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセル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をコピーしました