2010-11-30 73 views
5

J'utilise VBA derrière MS Access Dites que j'ai les méthodes globales foo1 et foo2 qui obtiennent les mêmes arguments mais font des choses différentes. Je sais qu'en C++ je peux assigner une fonction à un alias. Quelque chose comme: au lieu de:définir un alias de fonction dans VBA, possible?

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

Je veux écrire:

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

Puis-je faire cela sur vba?

Répondre

6

courrais costume?

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

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

Plus d'informations: http://msdn.microsoft.com/en-us/library/aa199108(office.10).aspx

+0

Personnellement, je n'aime pas vraiment courir beaucoup, mais oui , au moins cette solution va fonctionner, alors vous obtenez mon vote. –

+0

Fonctionne. Je vous remercie. Ne vois pas une raison pour ne pas l'utiliser ... –

1

Non, malheureusement, ce n'est pas possible avec VBA. Ce serait bien, mais il vous suffira de vous en tenir à votre première syntaxe.

Mise à jour: Donc, je maintiens mon affirmation originale que la construction proposée dans la question n'existe pas dans VBA, mais Alex K. et Remou ont fourni des solutions de contournement utilisables.

1

Essayez ceci:

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

L'opérateur AddressOf.

Cependant, comme indiqué sur http://discuss.fogcreek.com/joelonsoftware4/default.asp?cmd=show&ixPost=140196&ixReplies=19

« AddressOf est vraiment un hack pas cher. VB ne supporte pas les valeurs de la fonction de première classe comme la plupart des autres langues, mais avec AddressOf est le soutient à mi-chemin. Oui, vous pouvez obtenir l'adresse d'une fonction mais vous ne pouvez pas invoquer une fonction par adresse (sauf si cette fonction est un processeur de message et seulement ensuite avec la fonction WinWall CallWndProc.) Tout ce que vous pouvez faire pour simuler ce comportement est de prendre des objets dispatch génériques au lieu de que les objets supportent les fonctions nécessaires. "

Malheureusement, c'est à peu près aussi proche que je l'aurai. Pour plus d'informations sur AddressOf, voir here.

+0

idée géniale, mais je ne pas (encore) voir comment AdressOf aidera ici, car il ne peut pas être utilisé pour appeler une fonction au sein de VBA. –

+0

Il s'agissait plus d'un lien "essayez de voir les limites de VBA", malheureusement. AddressOf et l'appel de fonctions identiques à travers une interface (si l'autre affiche est correcte) sont à peu près aussi proche que vous obtiendrez. –

+1

Comme un hack terrible, vous pouvez réellement utiliser CallWindowProc pour appeler n'importe quelle adresse VBA du pointeur tant que la signature correspond et vous utilisez 0 pour le hwnd. Vous pouvez même passer As String. –

3

Si les 2 fonctions ont été implémentées dans 2 modules de classe différents, vous pouvez leur donner le même nom & les appeler via une interface. C'est à peu près aussi proche que possible. (Et son peu près)

'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

Interfaces dans VBA? C'est nouveau pour moi ... Je veux dire, oui, vous pouvez * utiliser * des interfaces existantes, mais vous ne pouvez pas définir les vôtres et en faire des classes, ce qui serait nécessaire ici. Ou ai-je manqué quelque chose? –

+1

Bien sûr, si c'est un module de classe sans implémentation VBA peut le traiter comme une interface et toute autre classe peut implémenter ses membres publics, exemple mis à jour. –

+0

Très intelligent. Merci pour la mise à jour! Ne pas faire beaucoup en VBA de nos jours, mais cette astuce pourrait bien être utile un jour. Toujours semble un peu compliqué pour OP. –