MENU

Excel VBA クラスをインスタンス化する方法(Lv.4)

Excel VBA クラスのインスタンスを作成する方法

「Excel VBAのクラス」について4回目は、クラスを使うためにインスタンス化する方法について勉強します。

くるみこ
くるみこ

ここまでクラスの「プロパティ」「メソッド」について勉強しました。
今回はクラスの「インスタンス化」について勉強したいと思います (^^)

「インスタンス化」ってなんですか?
今回もよろしくお願いしますm(_ _)m

目次

はじめに

最初に使った標準モジュールのコードがこちらです。

'標準モジュールのコードサンプル
Sub MsgTest()
    Dim Say As Msg_sample 'インスタンス化したクラスを入れる変数
    Set Say = New Msg_sample 'クラスをNew(インスタンス化)する
    Say.Asa = "朝の挨拶:" 'オブジェクトのプロパティに値を代入する
    Say.Aisatu 'オブジェクトのメソッドを呼び出す
End Sub

クラスについて最初の記事はこちらです。
[https://www.kurumico.com/excel-vba-class1/12057/]

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 クラス名

このセットでクラスをインスタンス化します。

標準モジュールで入力支援表示される

2回目で使ったコードを再利用して説明します。
[https://www.kurumico.com/excel-vba-class2/12099/]

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でクラスのインスタンスを作成する方法について紹介しました。

今回覚えておいてほしい大事なことはこちらです。

【クラスのインスタンス作成方法】
Dim 変数名 As クラス名  のように、クラス名型の変数を入力します。
Set 変数名 = New クラス名  のように、Setでその変数にNewキーワードでクラスオブジェクトを代入してインスタンス化します。変数名=インスタンス名

【インスタンスの開放】
作成したインスタンスは、プロシージャ終了時に自動でメモリから解放されます。
プロシージャ途中で「Set 変数名 = Nothing」すれば意図的に開放できます。

クラスについて学ぶことはまだまだたくさんあります。次の解説も是非ご覧ください。

[https://www.kurumico.com/excel-vba-class5/12196/]

Excel VBA クラスについての記事一覧

★★★ ランキング参加中! クリックしてね(^^)/ ★★★

過去記事のサンプルファイルをダウンロードできます

この記事のサンプル登録はありません。記事内のコードをご利用ください。

過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

プロフィール画像は愛犬「くるみ」
ブログ名の「くるみこ」kurumico.comはここからつけました。
このブログをとおして、自分の経験から少しでも皆さまのお役に立てる情報が発信できればと思い立ち上げました。VBAは独学ですが、過去にはVBでフリーソフトを作っていた経験と仕事でExcelVBAを酷使している中での気づきなどを発信していきます。

目次