エクセルVBAで自作クラスをインスタンス化する方法


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

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

前回の記事はこちら。

エクセルVBAでクラスに最も簡単なプロパティを追加する方法
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにお送りしています。今回はエクセルVBAで、クラスモジュールにパブリック変数を宣言して、クラスに最も簡単なプロパティを追加する方法です。

最も簡単なクラスを作って、そこに最も簡単なプロパティを追加しました。

ただ、クラス作って、プロパティを追加したのはいいんですけど…

クラスって、実際どうやって使うんでしたっけ?

えとですね、クラスはインスタンス化して使うんです。今回はそこんところ、お伝えしていきます。

大丈夫、「インスタンス化」なんて、言葉は難しいですけど、やってみれば簡単です。

ということで、今回はインスタンス化とは何かについて、またエクセルVBAでクラスをインスタンス化する方法についてお伝えします。

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

スポンサーリンク

前回のおさらい

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

前回までで、クラス「Person」を作成し、そこに「FirstName」というプロパティを追加しました。

というと、立派なことをした感じですが、新規のクラスモジュール「Person」を挿入して、たった1行の以下のコードを書いただけです。

Public FirstName As String

これでOK。

作成したクラスは F2 キーのオブジェクトブラウザー上で、「できている」ということが確認できました。

オブジェクトブラウザーで作成したクラスを確認

それで、クラス作ってプロパティ追加したのはいいけど、実際どうやって使うんだ?という話ですよね。

今回は、そこんところ進めていきます。

インスタンス化とは何か

クラスはできていたとしても、実際に「使えるようにする」には、もうひと手順必要です。

インスタンス化をする必要があります。

インスタンス化というのは、クラスに記載された内容をもとに実体のオブジェクトを生成するということです。つまり、実体化です。

クラスをインスタンス化すると、実体としてのオブジェクトを操作できるようになります。

なお、インスタンス化した実体のオブジェクトのことをインスタンスともいいます。

インスタンス化が不要なオブジェクトたち

さて、通常私たちがさんざんマクロで操作しているオブジェクトとして以下のようなものがあります。

  • Workbookオブジェクト
  • Worksheetオブジェクト
  • Rangeオブジェクト

ですが、これらをインスタンス化した覚え…ないですよね。

それもそのはず。

ブック、シート、そのシート上のセル範囲…これらは既にメモリ上に展開されて存在している「実体」ですよね。

実体化されているものは、オブジェクトとしてそのメンバーであるメソッドやプロパティを使って操作できます。

インスタンス化が必要なオブジェクトたち

ただ、一部のオブジェクトはインスタンス化してオブジェクトを生成しないと操作をすることができません。

メジャーどころでは、以下のようなものがあります。

  • Collectionオブジェクト
  • FileSystemObjectオブジェクト
  • Dictionaryオブジェクト

これらはMicrosoftさんが、あらかじめ作っておいてくださっているクラスなんです。

ただ、クラスとしては定義されてますけど、エクセルを起動しただけでは実体としては存在していません。

なので、オブジェクトとして使用するためにインスタンス化が必要なのです。

みんな「New」してインスタンス化しますよね?

同じように、自作のクラスも「New」が必要なのです。

自作のクラスをインスタンス化する

具体的なコードを使って解説をしていきましょう。

自作のクラスだとしても、インスタンス化の方法は、既存のクラスに対するものと同じです。

Dimステートメントで、クラスをインスタンス化して生成したオブジェクトをセットする変数の宣言を行います。

Dim 変数名 As クラス名

そして、Newキーワードでインスタンス化をして新たなオブジェクトを生成、そしてそれを宣言した変数にセットします。

Set 変数名 = New クラス名

クラスをインスタンス化するコード

標準モジュールに以下のSubプロシージャを作成してみてください。

Sub MySub()

Dim p As Person
Set p = New Person

Stop

End Sub

クラスPersonのインスタンスをセットする変数pを宣言し、その変数にPersonのインスタンスを新たに生成してセットする、というものです。

入力していく途中、DimステートメントのAsキーワードの後のデータ型の候補として「Person」クラスが登場しているはずです。

クラスを作ると、データ型として選択できるようになります。

自動メンバー表示の候補にクラス名が追加される

インスタンスが生成されたことを確認

上記のコードを実行すると、Stopステートメントでいったん中断しますよね。

そのタイミングで、生成されたインスタンスの様子を確認することができます。

ローカルウィンドウを使って確認するんです。

ローカルウィンドウでは、現在メモリに展開されている変数とその情報を確認することができます。

VBEのメニューから「表示」→「ローカルウィンドウ」で開くことができます。

式の欄に変数「p」が型「Person/Person」ということで記載されていますよね。

ローカルウィンドウでインスタンスを確認する

さらに、その「+」ボタンをクリックすると展開して、式「FirstName」とその内容を確認することができます。

値は「””」つまり空文字、型はStringとなっています。

これは、クラスモジュールに定義したプロパティです。

プロシージャ終了でインスタンスが開放される

F5 キーを押して処理を再開続行すると、プロシージャが終了して、ローカルウィンドウには何も表示されなくなります。

プロシージャが終了して、インスタンスがメモリから開放されたということです。

自作クラスがインスタンス化されて、そして開放されるまでの様子を、なんとなくでもご理解いただけましたか?

自作クラスのプロパティを使用する

せっかくなので、自作クラスのプロパティFirstNameも操作してみたいと思います。

先ほどのSubプロシージャを、以下のように修正してみてください。

Sub MySub()

Dim p As Person
Set p = New Person

p.FirstName = "Bob"
Stop

End Sub

プロパティFirstNameに、「Bob」という文字列を格納してみるというわけです。

途中、変数pに続いてピリオドを入力したときに、以下のように「FirstName」が候補として表示されますよね。

自作クラスのメンバーが候補として表示される
このように、クラスに定義したメンバーは、ちゃんと候補として表示されます。

プロパティに格納した内容を確認

実行して、プロパティに格納した内容を確認してみましょう。

また、Stopステートメントで中断しますので、ローカルウィンドウをチェック!

ローカルウィンドウでプロパティの内容を確認

ちゃんとFirstNameプロパティの値が格納されていることを確認できます。

まとめ

以上、エクセルVBAでクラスをインスタンス化する方法についてお伝えしました。

インスタンス化とは何か、なぜそのような手順が必要なのか、わかっていただけたらうれしいです。

さて、次回ですが、このクラスに簡単なメソッドを追加していきます。

エクセルVBAでクラスに最も簡単なメソッドを追加する方法
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズをお届けしております。今回エクセルVBAでクラスに最も簡単なメソッドを追加する方法をお伝えします。Subプロシージャを使いますよ。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセル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でエクセル表のデータを反映するメソッドとクラスを使うメリット

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