2010-11-30 13 views
5

私はMS Accessの背後にあるVBAを使用しています グローバルなメソッドfoo1とfoo2が同じ引数を取得しますが、異なることをしているとします。 私はC++で関数にエイリアスを割り当てることができます。 の代わり:ような何かはVBAで関数エイリアスを定義できますか?

If (term) then 
    foo1 arg1, arg2, arg3 
else 
    foo2 arg1, arg2, arg3 
End If 

私が書きたい:

Var new_func = Iff (term, foo1,foo2) 
new_func arg1, arg2, arg3 

私はVBAでこれを行うことができますか?

答えて

6

スーツを実行しますか?

new_func = IIf(term, "foo1", "foo2") 
''new_func arg1, arg2, arg3 

res = Run(new_func, "a", "b", 1) 

詳細情報:http://msdn.microsoft.com/en-us/library/aa199108(office.10).aspx

+0

は個人的にはあまり好きではありませんが、 、少なくともこの解決策が働くので、あなたは私の投票を得る。 –

+0

作品。ありがとうございました。なぜそれを使用しない理由が表示されません... –

1

残念ながら、これはVBAでは不可能です。いいですが、最初の構文に固執する必要があります。

更新:だから、私は質問で提案された構築物はVBAには存在しないというのが私のオリジナルの主張に立つが、Alex K.Remouは、使用可能な回避策を提供してきました。 AddressOfオペレータ

http://oreilly.com/catalog/vbanut/chapter/booklet.html#sect5

1

はこれを試してみてください。

しかし上に述べたようにhttp://discuss.fogcreek.com/joelonsoftware4/default.asp?cmd=show&ixPost=140196&ixReplies=19

「のAddressOfは、VBは、他のほとんどの言語と同様にファーストクラスの関数値をサポートしていません。本当に安いハックですが、のAddressOfがあるとはいあなたがアドレスを取得することができます。途中でそれをサポートしています(ただし、その関数がメッセージプロセッサで、Win32関数CallWndProcでない限り)アドレスで関数を呼び出すことはできません。この動作をシミュレートするためにできることは、関数ポインタの代わりにジェネリックなディスパッチオブジェクトを取り、オブジェクトが必要な機能をサポートしていることを確認してください」。

残念ながら、それはあなたが得るほど近いです。

AddressOfの詳細については、hereを参照してください。

+0

賢いアイデアが、私は(まだ)VBA内の関数を呼び出すために使用することはできませんので、AdressOfは、ここに助ける方法を見ていません。 –

+0

残念ながら、VBAのリンクの限界を見てみると、これはもっと "これでした。 AddressOfとインターフェイス上で同じ名前の関数を呼び出す場合(他のポスターが正しい場合)は、お近くのものとほぼ同じです。 –

+1

ひどいハックとして、実際にCallWindowProcを使ってVBAのアドレスを呼び出すことができます。ただし、署名が一致していれば&hwndに0を使用します。 As Stringも渡すことができます。 –

3

2つの関数が2つの異なるクラスモジュールで実装されている場合は、同じ名前の&をインターフェイス経由で呼び出すことができます。それはあなたが得ることができるほど近いです。 (およびその非常に近くない)

'empty interface class, name: IFoo 
Public Function TheFunc(i As Integer) As Long 
' 
End Function 
'class clsFoo1 
Implements IFoo 

Private Function IFoo_TheFunc(i As Integer) As Long 
MsgBox "I'm clsFoo1" 
End Function 
'class clsFoo2 
Implements IFoo 

Private Function IFoo_TheFunc(i As Integer) As Long 
MsgBox "I'm clsFoo2" 
End Function 
'module code; 
Dim myFoo As IFoo 
If var = 1 Then 
    Set myFoo = New clsFoo1 
Else 
    Set myFoo = New clsFoo2 
End If 

myFoo.TheFunc 12345 
+0

VBAのインターフェイス?それは私にとって初めてのことです。つまり、既存のインターフェイスを使用することはできますが、独自のインターフェイスを定義してクラスを実装することはできません。または私は何かを逃したか? –

+1

確かに、実装VBAを持たないクラスモジュールがそれをインタフェースとして扱うことができ、他のどのクラスもpublicメンバーを実装することができます。 –

+0

非常に巧妙です。更新していただきありがとうございます!最近はVBAでこれほど多くのことをやっていませんが、このトリックはちょっと便利になるかもしれません。まだOPのためにちょっと巻き込まれているようです。 –

関連する問題