SSブログ

[VBA]クラスモジュールのインスタンス生成タイミングについて [Programming ExcelVBA]

[はじめに]
VBAは、Javaや.NET系言語程ではありませんが、
オブジェクト指向をサポートしています。

Javaや.NETとの違いの1つとして、
インスタンスの生成タイミングがあります。
Javaや.NETの感覚でコーディングすると間違いに陥りやすいので、
備忘録として記載します。

[インスタンスの生成タイミング]
インスタンスの生成はJavaなどでは、
『New』を指定するとインスタンスが生成されますが、
VBAでは記載の仕方によって、
必ずしも生成されるとは限りません。

例えば、Javaの場合、
newを指定するタイミングでインスタンスが生成され、
その参照が変数に格納されます。
クラスモジュールのインスタンス生成タイミング_java.png
それに対して、VBAの場合は、
Newを指定したタイミングではインスタンスは生成されず、
その変数に初めてアクセス(メソッド呼出しなど)するタイミングで、
インスタンスが生成されます。
クラスモジュールのインスタンス生成タイミング_vba.png
インスタンス生成タイミングの検証として、
下記のコードを実行してみると以下のようになります。
もし、Javaや.NETと同じように
宣言時にインスタンス生成がされるのであれば、
出力結果は、
 (1)インスタンスをNew付で宣言します。
 (a)インスタンスが生成されました。 ★JavaやC#ならこのタイミング
 (2)これからインスタンスにアクセスします。
 (b)MethodA実行中
となるはずですが、
実際は次のようになります。
 (1)インスタンスをNew付で宣言します。
 (2)これからインスタンスにアクセスします。
 (a)インスタンスが生成されました。 ★VBAの場合、初回メソッド実行時
 (b)MethodA実行中
これは、宣言時にインスタンスは作成しておらず、
MethodAを実行する際に、インスタンスが生成していることを示します。

[VBAのコード]
Option Explicit

Private Sub TestA()
    Dim a As New Hoge
    Debug.Print "(1)インスタンスをNew付で宣言します。"
    Debug.Print "(2)これからインスタンスにアクセスします。"
    a.MethodA

    '実行結果
    '(1)インスタンスをNew付で宣言します。
    '(2)これからインスタンスにアクセスします。
    '(a)インスタンスが生成されました。
    '(b)MethodA実行中
End Sub
[VBA]インスタンスの生成タイミングの検証(Hogeクラスの呼出し側)


Option Explicit

Private Sub Class_Initialize()
    Debug.Print "(a)インスタンスが生成されました。"
End Sub

Public Sub MethodA()
    Debug.Print "(b)MethodA実行中"
End Sub
[VBA]インスタンスの生成タイミングの検証(Hogeクラス)


[その他]
 VBAを例に説明していますが、
 VisualBasic6(VB6)系の言語にも同様なことが言えます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。