Excel VBAを使用してUDFを作成しています。異なる引数が異なる関数を呼び出すように、自分のUDFに2つの異なるバージョンをオーバーロードしたいと思います。関数のオーバーロードとExcel VBAのUDF
VBAはこれをサポートしていないようだから、誰も同じ目標を達成するうえで、良い、不器用な方法を提案できますか?オプションの引数を使用すべきか、それとも良い方法がありますか?
Excel VBAを使用してUDFを作成しています。異なる引数が異なる関数を呼び出すように、自分のUDFに2つの異なるバージョンをオーバーロードしたいと思います。関数のオーバーロードとExcel VBAのUDF
VBAはこれをサポートしていないようだから、誰も同じ目標を達成するうえで、良い、不器用な方法を提案できますか?オプションの引数を使用すべきか、それとも良い方法がありますか?
...あなたの引数リストのバリアントデータ型を使用することを検討して、TypeOf関数ステートメントを使用して入力し何かを把握し、次にあなたが何かを把握する際に適切な関数を呼び出したいmightaそして、あなたは彼らがIsMissing()
を使用して不足しているかどうかをテストするか、次の例に示すように、TypeName()
を使用して自分のタイプを確認することができ、Optional Variants
としてあなたの引数を宣言します。
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(数)、又は= FOO( "ストリング")。
VBAは面倒です。私は偽のオーバーロードを行う簡単な方法がないと確信していません。
これまで、私は多くのオプションを使用していたか、さまざまな機能を使用していました。インスタンス
Foo_DescriptiveName1()
Foo_DescriptiveName2()
のために私は、あなたのケースのために呼び出すために別々の機能を作成し、引数リストは愚かな取得するつもりされていない限り、適切なデフォルト値を持っているオプションの引数で行くと思います。
あなたはまた、
あなたは、パラメータの数によって区別することができた場合は、このような何かが働くだろう:
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を行うために必要があるとしている++署名によって呼び出されるオーバーライドされた関数doを持つ他の言語が含まれます。私はコールを次のように見せることをお勧めします。
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
あなたが期待するシグネチャと一致するいくつかの方法でクラスを作成してください。あなたはおそらく何らかのエラー処理を必要とし、認識可能な型が限られていることに注意してください:日付はTypeName Doubleです。
ありがとう、それはそれを行う良い方法のように聞こえる。 – Patrick
Joel、VB/VBAでVariantをお持ちいただき、ありがとうと思いますか? ;-) – Yarik
はい。スプレッドシートのセルに入る可能性のあるものは、Basic変数に入れることができると感じて以来、Excelにとって重要でした。そうしないと、セルを読み取るという単純な行為に数行のコードが必要でした。 –