2008-09-15 38 views
24

Excel VBAを使用してUDFを作成しています。異なる引数が異なる関数を呼び出すように、自分のUDFに2つの異なるバージョンをオーバーロードしたいと思います。関数のオーバーロードとExcel VBAのUDF

VBAはこれをサポートしていないようだから、誰も同じ目標を達成するうえで、良い、不器用な方法を提案できますか?オプションの引数を使用すべきか、それとも良い方法がありますか?

答えて

46

...あなたの引数リストのバリアントデータ型を使用することを検討して、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( "ストリング")

+0

ありがとう、それはそれを行う良い方法のように聞こえる。 – Patrick

+0

Joel、VB/VBAでVariantをお持ちいただき、ありがとうと思いますか? ;-) – Yarik

+7

はい。スプレッドシートのセルに入る可能性のあるものは、Basic変数に入れることができると感じて以来、Excelにとって重要でした。そうしないと、セルを読み取るという単純な行為に数行のコードが必要でした。 –

0

VBAは面倒です。私は偽のオーバーロードを行う簡単な方法がないと確信していません。

これまで、私は多くのオプションを使用していたか、さまざまな機能を使用していました。インスタンス

Foo_DescriptiveName1() 

Foo_DescriptiveName2() 

のために私は、あなたのケースのために呼び出すために別々の機能を作成し、引数リストは愚かな取得するつもりされていない限り、適切なデフォルト値を持っているオプションの引数で行くと思います。

0

あなたはまた、

3

あなたは、パラメータの数によって区別することができた場合は、このような何かが働くだろう:

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です。