2010-04-22 31 views
6

Es fácil llamar a una función dentro de un classModule usando CallByName ¿Qué hay de las funciones dentro del módulo estándar?Llamar a un Sub o Función contenida en un módulo usando "CallByName" en VB/VBA

''#inside class module 
''#classModule name: clsExample 
    Function classFunc1() 
    MsgBox "I'm class module 1" 
    End Function 
''# 
''#inside standard module 
''#Module name: module1 
    Function Func1() 
    MsgBox "I'm standard module 1" 
    End Function 
''# 
''# The main sub 
Sub Main() 
''# to call function inside class module 
dim clsObj as New clsExample 
Call CallByName(clsObj,"ClassFunc1") 

''# here's the question... how to call a function inside a standard module 
''# how to declare the object "stdObj" in reference to module1? 
Call CallByName(stdObj,"Func1") ''# is this correct? 

End Sub 
+1

No puedes. Busque 'Application.Run', que funciona con rutinas en módulos estándar. – jtolle

+0

Como sus 'funciones' no son valores de reajuste, debería usar 'Sub' en lugar de' Function'. 'Call' nunca es necesario, simplemente puede escribir' CallByName clsObj, "ClassFunc1" '. Llamar a una función Func1 dentro de un módulo estándar es tan simple como 'Func1' - usar los modificadores apropiados en la declaración para cambiar el alcance si es necesario – barrowc

Respuesta

2

CallByName funciona solo con objetos de clase.

Si el subprograma está en un módulo estándar, puede hacer esto:

Sub Main() 
    Module1.Func1 
End Sub 

Si se trata de una función, entonces es probable que desee para capturar el valor de retorno; algo como esto:

Sub Main() 
    Dim var 
    var = Module1.Func1 
End Sub 
3

creo que la respuesta de jtolle abordó la cuestión mejor - la pequeña referencia a Application.Run puede ser la respuesta. El cuestionario no quiere usar simplemente func1 o Module1.func1 - la razón por la que uno querría usar CallByName en primer lugar es que el nombre de function.sub deseado no se conoce en tiempo de compilación. En este caso, Application.Run funciona, por ejemplo .:

Dim ModuleName As String 
Dim FuncName As String 
Module1Name = "Module1" 
FuncName = "func1" 
Application.Run ModuleName & "." & FuncName 

También puede anteponer el nombre del proyecto antes de la ModuleName y añadir otro punto "". Desafortunadamente, Application.Run no devuelve ningún valor, por lo tanto, aunque pueda invocar una función, no obtendrá su valor de retorno.

+3

Esto es frustrante. Aparentemente la sabiduría de Internet es usar 'Application.Run' si tienes un módulo y' CallByName' si tienes un objeto de clase. Desafortunadamente no son intercambiables! El manejo de errores, en particular, es diferente. Si alguien genera un error en el código llamado por 'Application.Run', no puedo verlo en mi procedimiento, pero' CallByName' sí me permite detectarlo. ¿Hay algún trabajo alrededor? –

0

Desafortunadamente no es posible anteponer el ProjectName antes del ModuleName y agregar otro período "." En MS Word esto arroja un error de tiempo de ejecución 438. La llamada está restringida al uso de simplemente ModuleName.ProcName.

1

Los módulos en VB6 y VBA son algo así como clases estáticas, pero desafortunadamente VB no acepta el Módulo1 como un objeto. Puede escribir Module1.Func1 como C.Func1 (C es una instancia de alguna clase 1), pero esto obviamente lo hace el compilador, no en tiempo de ejecución.

Idea: Convierta el Module1 en una clase, cree un "Public Module1 como Module1" en su módulo de inicio y "Establezca Module1 = New Module1" en su "Sub Main".

Cuestiones relacionadas