条件分岐以外で、実行関数を動的に変えたい場合に、CallByName関数を使って実現しました。
CallByName関数
指定したオブジェクトのプロパティへのアクセス、およびメソッドの実行を行います。
CallByName (object, procname, calltype, [args()]_)
引数 | 説明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
object | Variant、またはObject型の実行対象オブジェクト。 | ||||||||||
procname | 文字列型のオブジェクトのプロパティ、またはメソッドの名前。 | ||||||||||
calltype | 呼び出されるプロシージャを表すvbCallType型定数。
|
||||||||||
args() | メソッド実行時の引数、またはプロパティに設定する値。 |
使用方法
クラスモジュール SampleCls
Public Sub Func1(val As Integer)
Debug.Print val
End Sub
Public Sub Func2(val As Integer)
Debug.Print val * val
End Sub
標準モジュール
Sub Sample1()
For funcNum = 1 To 2
CallByName New SampleCls, "Func" & funcNum, VbMethod, 3
Next funcNum
End Sub
上記では呼び出す関数名をForループのカウンタから指定しています。
パターンが少なければ条件分岐で書くほうがわかりやすいでしょうが、パターンが増えてきた場合などは、CallByNameを使ったほうがすっきりと書けます。
私の場合は、シート上に関数名を列挙しておいてリストボックスのインデックスによって列挙したものの中から呼び出すといった使い方をしました。
また、オブジェクト違いで同名の関数を呼び出す際にも使うことができます。
実装の幅が増えるので是非とも覚えておきたい関数です