「Excel VBAのクラス」について4回目は、クラスを使うためにインスタンス化する方法について勉強します。
ここまでクラスの「プロパティ」「メソッド」について勉強しました。
今回はクラスの「インスタンス化」について勉強したいと思います (^^)
「インスタンス化」ってなんですか?
今回もよろしくお願いしますm(_ _)m
はじめに
最初に使った標準モジュールのコードがこちらです。
'標準モジュールのコードサンプル
Sub MsgTest()
Dim Say As Msg_sample 'インスタンス化したクラスを入れる変数
Set Say = New Msg_sample 'クラスをNew(インスタンス化)する
Say.Asa = "朝の挨拶:" 'オブジェクトのプロパティに値を代入する
Say.Aisatu 'オブジェクトのメソッドを呼び出す
End Sub
3~4行目がクラスを「インスタンス化」している部分です。
今回は、このクラスからインスタンスを作る「インスタン化」について勉強しましょう。
【この記事でわかることは】
・クラスからインスタンスを作る方法「インスタン化」について
クラスからインスタンスを作成する
クラスには「プロパティ」と「メソッド」で「設計図」が書いてあります。
インスタンスとは、クラス(設計図)から実際に使えるように(実体化)することです。
New演算子
インスタンス化する際には「New演算子」を使います。
「New演算子」はクラス(設計図)からインスタンス(実体)を作るときに使う演算子です。
「Collectionオブジェクト」や「FileSystemObjectオブジェクト」は「Collectionオブジェクト」や「FileSystemObjectオブジェクト」などのオブジェクトをインスタンス化する際にも使っているものです。
実は「Collectionオブジェクト」や「FileSystemObjectオブジェクト」も Excel VBA にあらかじめ設定されているクラスなんです。New演算子でインスタンス化することで利用できるようになるんです。
インスタンス化の方法
クラスをインスタンス化する手順と書き方です。
まずは、Dimステートメントで、インスタンス化したクラスを入れておくための変数を宣言します。
変数の型はインスタンス化するクラス名です。
Dim 変数名 As クラス名
これで、クラスからインスタンス化されたオブジェクトを入れる変数が用意できました。
次はいよいよ「Newします」。New がインスタンス化するキーワードです。
Set 変数名 = New クラス名
Newキーワードでクラスをインスタンス化してオブジェクトを生成します。
生成したオブジェクトを、宣言しておいた変数にセット(Set)します。
※オブジェクトを代入するには、頭に Set を付ける必要があります。
こんな感じです。
Dim Say As Msg_sample 'インスタンス化したクラスを入れる変数
Set Say = New Msg_sample 'クラスをNew(インスタンス化)する
Dim 変数名 As クラス名
Set 変数名 = New クラス名
このセットでクラスをインスタンス化します。
標準モジュールで入力支援表示される
Option Explicit
'標準モジュールのコードサンプル
Sub MsgTest()
Dim Say As Msg_sample 'インスタンス化したクラスを入れる変数
Set Say = New Msg_sample 'クラスをNew(インスタンス化)する
Dim num As Long
re:
num = Application.InputBox( _
"呼び出す時間帯の番号を入力してください" & vbCrLf & _
"[キャンセル]又は「0」で中止!" & vbCrLf & _
"1=[朝]、2=[昼]、3=[晩]、4=[深夜]", "番号選択", Type:=1)
Select Case num
Case 0: Exit Sub
Case 1
Say.Asa = "朝の挨拶:" 'クラスのAsaプロパティに値を代入する
Case 2
Say.Hiru = "昼の挨拶:" 'クラスのHiruプロパティに値を代入する
Case 3
Say.Ban = "晩の挨拶:" 'クラスのBanプロパティに値を代入する
Case 4
Say.Sinya = "深夜の挨拶:" 'クラスのSinyaプロパティに値を代入する
Case Else
MsgBox "入力値が不正です!再指定してください。"
GoTo re
End Select
Say.Aisatu 'オブジェクトのメソッドを呼び出す
End Sub
このコードを入力する際には次の画像のように入力支援が働きます。
作成されている「クラス名」やクラスの「プロパティ」や「メソッド」などのメンバーが入力候補に表示されます。
ローカルウィンドウでインスタンスを確認する
前段では、入力支援機能に表示されることを確認しましたが、ローカルウィンドウで生成されたインスタンスの情報を詳しく確認することができます。
ローカルウィンドウを開くには「VBEメニュー」→「表示」→「ローカルウィンドウ」とクリックしていけば表示できます。
ローカルウィンドウを表示した状態で、ステップ実行するなどの方法で確認することが出来ます。
式に変数「Say」、型に「Msg_sample/Msg_sample」と表示されています。
「Say」左側の「+」ボタンを展開すると、式に「各プロパティ名」が表示され詳細を確認することができます。
値は「””」空文字で、型は String とクラスモジュールで定義したとおりとなっています。
クラスモジュール側も確認
クラスモジュール側でローカルウィンドウを確認すると、次の画像のとおりインスタンスは「Meキーワード」で表示されていることがわかります。
先ほど標準モジュールで 1=[朝] を選択したので「Asa」の値に “朝の挨拶” の文字列が入っていることが確認できます。
「Meキーワード」について
インスタンスが「Me」というキーワードとなっています。
「Me」というのは、自身のインスタンスを指します。
画像の「Me.Asa」は、生成されたインスタンス自身の「Asa]プロパティの値「朝の挨拶」を返しているということです。
Meキーワードは、クラスモジュールで表示できますが、標準モジュールでは使用できません。
標準モジュールで使った場合は「Meキーワードの使い方が正しくありません」というエラーが発生してしまいます。標準モジュールではインスタンス化したオブジェクトの名前を使う必要があります。
「Meキーワード」で入力支援できる
クラスモジュールで「Me.」と入力すると、定義しているプロパティやメソッドが入力候補に表示させることができます。
「Meキーワード」はサンプルのコード例のように入力していなくても問題なく動作します。でも、長いコードを書く場合などでは入力支援も利用できますので「Meキーワード」を使えば便利です。
インスタンスの開放
クラスがインスタンス化されると、メモリ上にロードされて保存されます。
そして、プロシージャが終了すると、インスタンスはガベージコレクション機能でメモリ上から開放されます。 ※ガベージコレクション機能とは、使わなくなったメモリを解放する機能
意図的にインスタンスを開放する
サンプルのコード例ではプロシージャ内で意図的にインスタンスの開放は行っていません。
クラスのインスタンスを使い終わっても、プロシージャ内で他の処理がまだ継続するような場合には、意図的にインスタンスのメモリを解放したほうが良いでしょう。
意図的にメモリを開放するには、次のように Set していたインスタンスに Noting を代入して解放します。
Set 変数名 = Nothing
オブジェクトを開放するときと同じですね。
まとめ(おわりに)
以上、Excel VBAでクラスをインスタンス化する方法について確認しました。
クラスについて4回目です。インスタンス化の勉強はひとまずここまでです。
クラスのインスタンスを作る方法については理解できましたか?
ここは一番大事な部分ですのでしっかり覚えてくださいね(^^)
Dim 変数名 As クラス名 + Set 変数名 = New クラス名
がクラスをインスタンス化する決まりですね(^^)
次回からプロパティプロシージャについて勉強したいと思います(^^)/
たぶん複数回に分けていくことになると思いますがよろしくお願いします。
わかりました。よろしくお願いしますm(_ _)m
まとめと感想など
以上、Excel VBAでクラスのインスタンスを作成する方法について紹介しました。
今回覚えておいてほしい大事なことはこちらです。
クラスについて学ぶことはまだまだたくさんあります。次の解説も是非ご覧ください。
Excel VBA クラスについての記事一覧
★★★ ランキング参加中! クリックしてね(^^)/ ★★★
過去記事のサンプルファイルをダウンロードできます
この記事のサンプル登録はありません。記事内のコードをご利用ください。
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください