LoginSignup
22
24

More than 5 years have passed since last update.

VBA/VBScriptのクラスのコンストラクタに引数を渡したい

Posted at

概要

VBA / VBScriptのコンストラクタといえば Class_Initialize ですが、
モダンな言語とは異なり、コンストラクタに引数を渡すことができません。
そこで似非ではありますが、こんな感じで引数を渡せるようにしました。

Sample.vbs
Dim arg1 : arg1 = "foo"
Dim arg2 : arg2 = 1234

Dim objSample
Set objSample = (New clsSample)(arg1, arg2)

作成ポイント

  • Defaultキーワードの付いたGetterプロパティを作成する
    • ※値が返せればいいので、Functionでも可能
  • Getterプロパティはクラス自身(Me)を返す

実際のコード

SampleClass.vbs
Class clsSample
    Private PriStrArg1, PriStrArg2

    ' VBScriptの標準コンストラクタ
    Private Sub Class_Initialize()
        ' do stuff
    End Sub

    'コンストラクタの引数を受け取り、クラス自身を返すプロパティを作成
    Public Default Property Get Constructor(StrArg1, StrArg2)
        PriStrArg1 = StrArg1
        PriStrArg2 = StrArg2

        Set Constructor = Me
    End Property
End Class

動作概要

  • プロパティ(もしくはメソッド)に付与されている Default キーワードによって、プロパティを省略してクラスにアクセスした際にConstructorが呼び出される
  • Constructorプロパティ内で自身を返すことで、クラスの変数への代入を行う
    • メソッドチェーンを実現するための書き方と同じです

処理としては以下と等価です

Sample.vbs
Dim arg1 : arg1 = "foo"
Dim arg2 : arg2 = 1234

Dim objSample
Set objSample = New clsSample
Call ObjSample.Constructor(arg1, arg2)

おわりに

  • これをやったところでコンストラクタの引数を必須にはできません。
    • 普通に引数なしで New clsSample できてしまいます
  • こんな意味わからないことしてコード読みにくくするくらいなら手続き的に書きましょう
  • こんなのよりPowerShellを覚えましょう
22
24
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
24