エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する


add

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

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

前回の記事はこちら。

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

自作のコレクションから要素を取得するItemプロパティを作成しました。

さて、今回も自作のコレクションを便利にしていきますよ。

今回は、エクセルVBAで自作のコレクションに要素を追加するメソッドを作っていきます。

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

前回のおさらい

まず、前回のおさらいからです。

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

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

この一行分のデータを表すPersonというクラスと、それを集合として取り扱うPersonsというクラスを作成しています。

Personクラスのコードはこちらです。

Personのデータを格納するプロパティをはじめ、たくさんのメンバーを追加しました。

10~15行目の初期データをセットするInitializeメソッドについて、今回ちょっと変更を加えたりしますので、目を通しておいてくださいね。

Personsクラスのコードがこちらです。

前回はこのPersonsクラスに、要素を参照するためのItemプロパティを追加しました。

それを検証するための標準モジュールがこちら。

独自コレクションに要素を追加するメソッド

現状のPersonsクラスですが、Class_Initializeプロシージャにより、インスタンス生成時に前述のエクセル表のデータが追加されるようになっています。

しかし、新たに要素を追加したい場合はどうしたらよいでしょうか?

前回、Collection型のオブジェクト変数items_を隠蔽した今、標準モジュールから新しい要素を追加するのは不可能になってしまいました…

ということで、今回は独自コレクションのPersonsに、新たに要素を追加するAddメソッドを作成していきます。

シンプルにAddメソッドを作成する

クラスPersonsのAddメソッドのコード

シンプルに考えるなら、クラスPersonsに以下のようなコードを追加すれば良さそうです。

エクセル表の1行分のデータに該当するデータを配列で渡してAddメソッドを呼び出すと、それを初期データとしたPersonオブジェクトを生成して、それをPersonsコレクションに追加するというものです。

Addメソッドの動作を確認する

標準モジュールに以下のようなコードを作成して、Stop時にローカルウィンドウを確認します。

プライベート変数items_に新しい要素が追加されてますし、Addメソッドの戻り値として生成したPersonオブジェクトが取得できています。

PersonsコレクションのAddメソッドの検証

処理の共通化

ただ、先ほどのAddメソッドの初期データの追加の処理が、PersonクラスのInitializeメソッドとほんのり処理がかぶっているのが気になります。

PersonsクラスのAddメソッドから、PersonクラスのInitializeメソッドを呼び出すようにしたら、処理が共通化できて気持ちが良さそうです。

ただ、Initializeメソッドで受け取る引数はRangeオブジェクトで、Addメソッドで渡したいのは配列…

ちょっと工夫が必要ですね。

データのタイプにより分岐する

PersonクラスのInitializeメソッドで値をVariantで受け取って、そのデータのタイプを調べて分岐するという作戦はどうでしょうか。

TypeName関数を使えば、受け取った変数のデータタイプを調べることができます。

TypeName(変数名)

Rangeオブジェクトであれば「Range」、Array関数で生成した配列であれば「Variant()」が得られます。

その他のタイプの場合を知りたい場合はこちらへどうぞ。

TypeName 関数 (Visual Basic for Applications)

さて、それをベースに、Initializeメソッドを以下のように変更することができます。

Personsクラスの各メンバーをシンプルにまとめる

すると、PersonsクラスのAddメソッドは以下のようにシンプルにまとめることができます。

ついでに、PersonsクラスのClass_InitializeプロシージャもAddメソッドを使うことで、シンプルにまとめられます。

前述の標準モジュールのMySubを実行して、同じ結果が得られることを確認してください。

まとめ

以上、エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する方法をお伝えしました。

少し、難易度が上がってきた感じはありますが、いい練習になるのではないでしょうか。

ここまで来ると色々な選択肢があるので、ぜひ好みの組み方を見つけてみてください。

さて、次回はコレクションの要素の削除について見ていきたいと思います。

エクセルVBAで自作コレクションの要素を削除するメソッドの作り方
「初心者でもわかるエクセルVBAのクラスモジュール」シリーズをお送りしています。今回は、エクセルVBAで自作コレクションの要素を削除するRemoveメソッドの作り方についてお伝えしていきます。

どうぞお楽しみに!

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