2010-11-30 17 views
5

MS Access'in arkasındaki VBA'yı kullanıyorum Aynı argümanları alan ama farklı şeyler yapan foo1 ve foo2 global yöntemlere sahip olduğumu varsayalım. C++ 'da bir işlevi bir takma ad verebilirim. Bir şey gibi: yerine:, VBA'da bir işlev takma ismini, mümkün mü?

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

ben yazmak istiyorum:

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

Bu vba üzerinde yapabilir mi?

cevap

6

takım çalıştırın misiniz?

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

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

fazla bilgi: http://msdn.microsoft.com/en-us/library/aa199108(office.10).aspx

+0

Şahsen gerçekten Çok fazla koşma, ama evet En azından bu çözüm işe yarayacak, oyumu aldınız. –

+0

Çalışmaları. Teşekkür ederim. Kullanmamanın bir sebebi yok. –

1

Hayır, maalesef, bu VBA ile mümkün değil. Güzel olurdu, ama sadece ilk sözdizimine bağlı kalmalısın.

Güncelleştirme: Bu nedenle, özgün önermemde, söz konusu önerilen önermenin VBA'da mevcut olmadığını, ancak Alex K. ve Remou kullanılabilir geçici çözümler sağladığını düşünüyorum.

1

bu deneyin:

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

AddressOf operatörü.

Ancak üzerinde belirtildiği gibi http://discuss.fogcreek.com/joelonsoftware4/default.asp?cmd=show&ixPost=140196&ixReplies=19

"AddressOf VB çoğu diğer diller gibi birinci sınıf fonksiyon değerlerini desteklemez. Gerçekten ucuz bir hack olmakla AddressOf olduğu ile Evet adresi alabilirsiniz. Yarıya destekliyorsa bir işlev ancak bir işlevi tarafından bir işlevi çağırılamıyor (bu işlev bir ileti işlemcisi değilse ve yalnızca Win32 işleviyle CallWndProc ise) .Bu davranışı simüle etmek için yapabileceğiniz tek şey, işlev işaretçileri yerine genel gönderim nesnelerini almak ve Nesnelerin gerekli işlevleri desteklediğini "

Maalesef, alacağınız kadar yakın, inanıyorum.

AddressOf hakkında daha fazla bilgi için bkz. here.

+0

Zekice bir fikir, ama ben yapamam (henüz) o VBA içinde bir işlevi çağırmak için kullanılamaz çünkü AdressOf, burada yardımcı olacak nasıl bakın. –

+0

Maalesef ne yazık ki 'VBA sınırlarını görmek için bunu deneyin'. AddressOf ve bir arabirimde aynı adlı işlevleri çağırmak (diğer poster doğruysa) alacağınız kadar yakın. –

+1

Korkunç bir hack olarak, SignWindowProc'u işaret eşleştiği sürece işaretçinin herhangi bir VBA adresini çağırmak için kullanabilirsiniz ve hwnd için 0'ı kullanabilirsiniz. As String'i bile geçirebilirsiniz. –

3

2 işlev 2 farklı sınıf modülünde uygulandıysa, onlara aynı adla & bir arabirimde çağrı yapabilirsiniz. Bu senin alabildiğin kadar yakın. (Ve onun çok yakın değil)

'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

Arabirimler VBA'da? Bu benim için yeni ... Yani, evet, * mevcut arayüzleri * kullanabilirsiniz, ancak kendiniz tanımlayamazsınız ve sınıfları bunları uygulayamazsınız, ki bu burada gerekli olacaktır. Yoksa bir şey özledim mi? –

+1

Elbette, VBA uygulanmayan bir sınıf modülü bir arabirim olarak davranabilirse ve başka bir sınıf genel üyelerini uygulayabilirse, örneğin güncelleştirildi. –

+0

Çok zekice. Güncelleme için teşekkürler! Bu günlerde artık VBA'da fazla bir şey yapmamakla birlikte, bu hile sadece bir gün işe yarayabilir. Hala OP için biraz sarsılmış görünüyor. –