UDF の書き込みに Excel VBA を使用しています。異なる引数が異なる関数を呼び出すように、独自の UDF をいくつかの異なるバージョンでオーバーロードしたいと考えています。
VBAはこれをサポートしていないようですが、同じ目標を達成するための、面倒ではない良い方法を誰かが提案できますか? オプションの引数を使用する必要がありますか、それともより良い方法がありますか?
UDF の書き込みに Excel VBA を使用しています。異なる引数が異なる関数を呼び出すように、独自の UDF をいくつかの異なるバージョンでオーバーロードしたいと考えています。
VBAはこれをサポートしていないようですが、同じ目標を達成するための、面倒ではない良い方法を誰かが提案できますか? オプションの引数を使用する必要がありますか、それともより良い方法がありますか?
引数を として宣言すると、次の例に示すように、を使用Optional Variants
して欠落しているかどうかをテストしIsMissing()
たり、 を使用して型を確認したりできます。TypeName()
Public Function Foo(Optional v As Variant) As Variant
If IsMissing(v) Then
Foo = "Missing argument"
ElseIf TypeName(v) = "String" Then
Foo = v & " plus one"
Else
Foo = v + 1
End If
End Function
これは、ワークシートから=FOO()、=FOO( number )、または=FOO(" string ")として呼び出すことができます。
パラメータ数で区別できる場合は、次のように機能します。
Public Function Morph(ParamArray Args())
Select Case UBound(Args)
Case -1 '' nothing supplied
Morph = Morph_NoParams()
Case 0
Morph = Morph_One_Param(Args(0))
Case 1
Morph = Two_Param_Morph(Args(0), Args(1))
Case Else
Morph = CVErr(xlErrRef)
End Select
End Function
Private Function Morph_NoParams()
Morph_NoParams = "I'm parameterless"
End Function
Private Function Morph_One_Param(arg)
Morph_One_Param = "I has a parameter, it's " & arg
End Function
Private Function Two_Param_Morph(arg0, arg1)
Two_Param_Morph = "I is in 2-params and they is " & arg0 & "," & arg1
End Function
関数を区別する唯一の方法が型によるものである場合、関数をオーバーライドするC ++やその他の言語が行うこと、つまり署名による呼び出しを効果的に行う必要があります。呼び出しを次のようにすることをお勧めします。
Public Function MorphBySig(ParamArray args())
Dim sig As String
Dim idx As Long
Dim MorphInstance As MorphClass
For idx = LBound(args) To UBound(args)
sig = sig & TypeName(args(idx))
Next
Set MorphInstance = New MorphClass
MorphBySig = CallByName(MorphInstance, "Morph_" & sig, VbMethod, args)
End Function
期待するシグネチャに一致するいくつかのメソッドを使用してクラスを作成します。ただし、おそらくエラー処理が必要になるでしょう。また、認識できるタイプは制限されていることに注意してください。たとえば、日付はTypeNameDoubleです。
VBAは面倒です。偽のオーバーロードを行う簡単な方法があるかどうかはわかりません。
過去に、多くの Optional を使用したり、さまざまな関数を使用したりしました。例えば
Foo_DescriptiveName1()
Foo_DescriptiveName2()
引数リストが愚かにならない限り、賢明なデフォルトを持つオプションの引数を使用してから、ケースを呼び出す別の関数を作成します。
また、引数リストにバリアント データ型を使用することを検討し、TypeOf ステートメントを使用してどの型が何であるかを把握し、何が何であるかを把握したときに適切な関数を呼び出すこともできます...