Excel VBAでコンストラクタに引数を渡す方法

こんにちは!大阪市を拠点に活動している『縁紡ぐ』の稲垣です。
SWELLを使ったホームページ制作や、Excel、ACCESS、RPAなどのシステム開発を行っています。
また、Excel、Word、Outlookの研修や、情報セキュリティ研修も行っています。身近なITの相談相手になりたいと思っています。
お気軽にお問い合わせください。
Excel VBAでコンストラクタに引数を渡す方法
Excel VBAでクラスモジュールを使う際、他のプログラミング言語と異なり、直接コンストラクタに引数を渡すことができません。JavaやPythonでは、当たり前のようにできたので、使いにくさを感じますよね。

VBAでは、コンストラクタに引数として値を渡すことはできないんです💦
これは、大きな制約です。ですが、ある状況で開発しなくてはなりません。
今回は、そんなコンストラクタ問題を回避する方法を考えました。この記事では、その方法を詳しく解説していきます。
コンストラクタに引数を渡す必要性
クラスをインスタンス化する際に初期設定が必要なケースは多々あります。例えば、特定のファイルパスや初期値を設定したい場合などです。多くのオブジェクト指向言語では、このような初期設定をコンストラクタで行いますが、VBAではその直接的な方法が提供されていません。
例えばHumanクラスから、Aさんを作る時に、名前を渡してインスタンス化する。ということができません。
'Humanクラス
Private nickName As String
Private Sub Class_Initialize(Bybal namae As String)
nickName = namae
End sub
'mainメソッド
Dim ahuman as Human
Set ahuman = New Human("大阪の稲垣") 'これが出来ない
解決策: 初期化メソッドの使用



ルールとして、必ずinitメソッドを作成しよう!
Excel VBAでは、コンストラクタへの引数渡しを模倣するために、クラスに初期化メソッド(Initなどの名前が一般的)を追加することが一つの解決策になります。この方法を用いることで、インスタンス化後にすぐに初期化メソッドを呼び出し、必要な引数を渡すことができます。
Private name As String
Public Sub init(namae As String)
Me.name = namae
End Sub
'mainメソッド
Dim ahuman as Human
Set ahuman = New Human
ahuman.init("大阪の稲垣")
initというSubプロシージャを追加し、インスタンス化直後に呼び出し、初期値を必ずセットするようにします。この手法によって、コンストラクタに引数を渡すことがでいない問題をクリアすることができます。



必要場合だけinitを作成するより、空でもinitを作成する!という、ルールの方が後々メンテナンスしやすくなりますよ
まとめ
Excel VBAでは直接コンストラクタに引数を渡すことはできませんが、初期化メソッドを用いることでこの制約を賢く回避することができます。この手法は、クラスの初期設定が必要なあらゆるシチュエーションで役立ちます。是非、この方法を活用して、より効率的で読みやすいVBAプログラムを作成してみてください。


稲垣
- Excel、ACCESSでのシステム開発が得意
- ITスキルを共有し実践的に学びながら成長する人を見るのが幸せ
- 自家焙煎するほどのコーヒー好き
- 使用言語 VBA、Python、Javascript、Java、HTML、CSS etc.
- 保有資格 Kintoneアソシエイト、日商簿記検定2級、マンション管理士、管理業務主任者、情報セキュリティマネジメント、ExcelVBA etc.
- 業務フロー図の作成や業務時間分析を通して、効率化ポイントを探る人
- お客様にとって本当に良いことかを第一に考える人
コメント