2012-03-28 15 views
9

Estoy programando en Microsoft VBA. Primero necesito generar una QueryTable con la ayuda de una macro (tengo el código para eso) y después de eso, con la ayuda de las macros, necesito aplicar fórmulas que usen los datos en la QueryTable. El problema al que me enfrento es que QueryTable aparece solo después de que el Sub, en el que está el código, haya terminado de funcionar. Eso significa que no puedo incluir el código que genera fórmulas en él, porque no hay datos para generar las fórmulas.Módulo VBA que ejecuta otros módulos

La idea ahora es escribir un módulo que se ejecuta otros módulos:

Sub moduleController() 
    Run "Module1" 
    Run "Module2" 
End Sub 

Esto da el error:

Run time error 1004 - cannot run the macro "macroname". The macro may not be available in this workbook or all macros may be disabled.

Cuál podría ser la solución? Tal vez hay otra solución para mi problema de carga de QueryTable?

+0

Hay dos posibles problemas con su QueryTable. 1.) ¿Está refrescando la consulta después de agregarla? 2.) Por defecto, las nuevas consultas se configuran para actualizar en segundo plano. Si no cambia eso, su macro no está esperando que finalice la consulta. Intente actualizar su consulta con '.Refresh BackgroundQuery: = False'. – mischab1

Respuesta

16

Siempre que las macros en cuestión estén en el mismo libro de trabajo y verifique que los nombres existen, puede llamar a esas macros desde cualquier otro módulo por nombre, no por módulo.

lo tanto, si en el módulo 1 que tenía dos macros macro1 y Macro2 y en Module2 que tenía Macro3 y Macro 4, a continuación, en otra macro que se podría llamar a todos ellos:

Sub MasterMacro() 
    Call Macro1 
    Call Macro2 
    Call Macro3 
    Call Macro4 
End Sub 
+0

Además, si Macro1 - Macro4 no están en el mismo módulo que MasterMacro, entonces Macro1 - Macro4 debe declararse como pública, no privada. – mischab1

+0

¡Gracias, Jerry! ¡Lo resolvió! Cabe señalar que otro problema con el que tropecé fue que el nombre de la macro no puede ser el mismo que el nombre del módulo. ¡Tienen que ser diferentes! – ositra

2

¿El "Módulo1" es parte del mismo libro de trabajo que contiene "moduleController"?
De lo contrario, puede llamar al método público de "Módulo1" utilizando Application.Run someWorkbook.xlsm!methodOfModule.

+0

Sí, está en el mismo Libro de trabajo. Sin embargo, ¡gracias por la línea de código! Aprendí algo nuevo. – ositra

1

acabo de saber algo nuevo gracias a Artiso . Le di un nombre a cada módulo en el cuadro de propiedades. Estos nombres también fueron lo que declare en el módulo. Cuando traté de llamar a mi segundo módulo, seguí recibiendo un error: Error de compilación: variable o procedimiento esperado, no módulo

Después de leer el comentario anterior de Artiso sobre no tener los mismos nombres, cambié el nombre de mi segundo módulo, lo llamé el primero, y el problema resuelto. ¡Cosas interesantes! Gracias por la información Artiso!

En caso de que mi experiencia es claro:

Nombre del Módulo: AllFSGroupsCY Public Sub AllFSGroupsCY()

Nombre del Módulo: AllFSGroupsPY Public Sub AllFSGroupsPY()

De AllFSGroupsCY()

Public Sub FSGroupsCY() 

    AllFSGroupsPY 'will error each time until the properties name is changed 

End Sub 
Cuestiones relacionadas