VBAの勉強を始めてみた

色々試しています。

インスタンスの生成について

前回は外部ライブラリを参照設定する方法を説明しました。今回は外部ライブラリのオブジェクトを使ってコーディングする方法を書いてみたいと思います。

まず、外部ライブラリのオブジェクトは参照設定するだけでは使用できないので、NEWキーワードを使ってインスタンスを生成する必要があります。インスタンスの生成というと初心者の方には分かりにくいかもしれませんが、つまり外部ライブラリにある○○オブジェクトをVBAProjectのプロシージャ側の変数(オブジェクト型)に代入する行為を指します。

f:id:kouten0430:20170911170401j:plain

少し変な例えかもしれませんが・・・・・・、あの世(外部ライブラリ)のものをこの世(VBA)で使うには、この世で姿かたちのある変数に入れてインスタンス化(実体化)する必要があるのです。
変数に入れてしまえば、あとは変数名.プロパティ変数名.メソッドのようにVBAの基本構文どおりに外部ライブラリのオブジェクトを使用することができます。

 

で、インスタンスを生成する方法ですが、実際には大きく分けて3通りほどあるようです。先述したNEWキーワードを使用する点に関しては共通ですが。
以下に、クリップボードのデータを変数Vに格納するまでの処理を3通りのインスタンス生成方法で紹介します。


一つ目は、一番スタンダードだと思われる方法です。
----------------------
Sub インスタンスの生成1()
    Dim myLib As Object
    Set myLib = New DataObject
    myLib.GetFromClipboard
    V = myLib.GetText
End Sub
----------------------
Set myLib = New DataObjectの行で、myLibというオブジェクト型の変数にDataObjectを代入しています(インスタンスの生成)。通常の代入と違うのはNewがついているところです。


二つ目は、変数の宣言時にNewをつけてしまう方法です。
----------------------
Sub インスタンスの生成2()
    Dim myLib As New DataObject
    myLib.GetFromClipboard
    V = myLib.GetText
End Sub
----------------------
Set~の代入式がなくなる分、コードが短くて済みます。ただし、インスタンスが生成されるタイミングは変数宣言時ではなく、コードの中で変数が使用されるタイミング(上の例ではmyLib.GetFromClipboardの行)になります。余談ですが、インスタンスが生成された後でSet myLib = Nothingと一旦変数を空にしても、次に変数を使用するタイミングで再びインスタンスが自動生成されます。なんだか、不死身のゾンビみたいです。


三つ目は、WithステートメントにNewをつける方法です。
----------------------
Sub インスタンスの生成3()
    With New DataObject
        .GetFromClipboard
        V = .GetText
    End With
End Sub
----------------------
Withについて補足すると、With ○○はSet 変数 = ○○と読み替えることができます。後のピリオドの前には常に変数があると思っていいでしょう。○○の頭にNewがあるとインスタンスの生成になります。余談ですが、Withで作られた仮の変数は内部的なものなので、ローカルウィンドウやウォッチウィンドウで見ることができません。End Withで仮の変数は空になるので、インスタンスが使用できるのはWith~End Withの間だけです。

 

以上の3つは、実行速度で微小な違いはあると思いますが、インスタンスが生成されるタイミング、インスタンス開放後の違い(再度、自動生成されるか否か)、インスタンスを使用できる範囲などに注意すれば、あとはお好みでいいと個人的には思います。