2010-11-30 14 views
5

Estoy usando VBA detrás de MS Access Digamos que tengo métodos globales foo1 y foo2 que obtienen los mismos argumentos pero hacen cosas diferentes. Sé que en C++ puedo asignarle un alias a una función. Algo así como: en lugar de:definir un alias de función en VBA, posible?

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

Quiero escribir:

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

¿Puedo hacer esto en VBA?

Respuesta

6

correría traje?

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

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

Más información: http://msdn.microsoft.com/en-us/library/aa199108(office.10).aspx

+0

Personalmente no me gusta mucho Run, pero sí , al menos esta solución funcionará, por lo que obtienes mi voto. –

+0

Funciona. Gracias. No veo un motivo para no usarlo ... –

1

No, desafortunadamente, eso no es posible con VBA. Sería bueno, pero solo tendrá que apegarse a su primera sintaxis.

Actualización: Por lo tanto, mantengo mi afirmación original de que el constructo propuesto en la pregunta no existe en VBA, pero Alex K. y Remou han proporcionado soluciones utilizables.

1

Prueba esto:

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

El operador AddressOf.

Sin embargo, como se indica en http://discuss.fogcreek.com/joelonsoftware4/default.asp?cmd=show&ixPost=140196&ixReplies=19

"AddressOf es realmente un truco barato. VB no admite valores de la función de primera clase como la mayoría de otros idiomas, pero con AddressOf es compatible con hasta la mitad. Sí se puede obtener la dirección de una función pero no puede invocar una función por dirección (a menos que esa función sea un procesador de mensajes y solo entonces con la función Win32 CallWndProc). Todo lo que puede hacer para simular este comportamiento es tomar objetos genéricos de envío en lugar de indicadores de función y que los objetos soportan las funciones necesarias. "

Desafortunadamente, eso es lo más cerca que se puede llegar, creo.

Para obtener más información sobre AddressOf, consulte here.

+0

idea inteligente, pero no es así (todavía) ver cómo AdressOf ayudará aquí, ya que no se puede utilizar para llamar a una función dentro de VBA. –

+0

Desafortunadamente, fue más un enlace "prueba esto para ver los límites de VBA". AddressOf y llamando a funciones con el mismo nombre a través de una interfaz (si otro póster es correcto) son lo más cerca que obtendrá. –

+1

Como un truco terrible, puede usar CallWindowProc para llamar a cualquier dirección de puntero de VBA siempre que la firma coincida y use 0 para el hwnd. Incluso puede pasar como cadena. –

3

Si las 2 funciones se implementaron en 2 módulos de clase diferentes, podría darles el mismo nombre & llamarlos a través de una interfaz. Eso es lo más cerca que puedes llegar. (Y su no muy cerca)

'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 en VBA? Eso es nuevo para mí ... Quiero decir, sí, puedes * usar * interfaces existentes, pero no puedes definir las tuyas y hacer que las clases las implementen, lo cual sería necesario aquí. ¿O me he perdido algo? –

+1

Claro, si es un módulo de clase sin implementación, VBA puede tratarlo como una interfaz y cualquier otra clase puede implementar sus miembros públicos, ejemplo actualizado. –

+0

Muy inteligente. ¡Gracias por la actualización! Ya no hace mucho en VBA estos días, pero este truco podría ser útil algún día. Todavía parece un poco intrincado para OP. –

Cuestiones relacionadas