So-net無料ブログ作成

[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)系の言語にも同様なことが言えます。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0