2012-03-28 10 views
9

Sto programmando in Microsoft VBA. All'inizio ho bisogno di generare una QueryTable con l'aiuto di una macro (ho il codice per quello) e poi con l'aiuto dei macro ho bisogno di applicare le formule che usano i dati in QueryTable. Il problema che sto affrontando è che QueryTable appare solo dopo che il Sub, in cui il suo codice è, ha finito di funzionare. Ciò significa che non posso includere il codice che genera formule al suo interno, perché non ci sono dati per le formule da generare.Modulo VBA che esegue altri moduli

L'idea in questo momento è quello di scrivere un modulo che gestisce altri moduli:

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

Questo dà l'errore:

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

Quale potrebbe essere la soluzione? Forse c'è un'altra soluzione per il mio problema di caricamento di QueryTable?

+0

Ci sono due possibili problemi con QueryTable. 1.) Stai aggiornando la query dopo averla aggiunta? 2.) Per impostazione predefinita, le nuove query vengono impostate per l'aggiornamento in background. Se non lo cambi, la tua macro non attende la fine della query. Prova ad aggiornare la tua query con '.Refresh BackgroundQuery: = False'. – mischab1

risposta

16

Finché le macro in questione si trovano nella stessa cartella di lavoro e si verifica la presenza dei nomi, è possibile chiamare tali macro da qualsiasi altro modulo per nome, non per modulo.

Quindi, se in Module1 tu avessi due macro Macro1 e Macro2 e in Module2 si aveva Macro3 e Macro 4, poi in un'altra macro li si potrebbe chiamare:

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

Inoltre, se Macro1 - Macro4 non si trova nello stesso modulo di MasterMacro, Macro1 - Macro4 deve essere dichiarato come pubblico, non privato. – mischab1

+0

Grazie, Jerry! L'hai risolto! Si noti che un altro problema su cui sono incappato è che il nome della macro non può essere lo stesso del nome del modulo. Devono essere diversi! – ositra

2

La parte "Module1" della stessa cartella di lavoro contiene "moduleController"?
In caso contrario, è possibile chiamare il metodo pubblico di "Module1" utilizzando Application.Run someWorkbook.xlsm!methodOfModule.

+0

Sì, è nella stessa cartella di lavoro. Tuttavia, grazie per la linea di codice! Ho imparato qualcosa di nuovo. – ositra

1

Ho appena imparato qualcosa di nuovo grazie a Artiso . Ho dato ad ogni modulo un nome nella finestra delle proprietà. Questi nomi erano anche ciò che ho dichiarato nel modulo. Quando ho provato a chiamare il mio secondo modulo, ho continuato a ricevere un errore: Errore di compilazione: Variabile o procedura prevista, non il modulo

Dopo aver letto il commento di Artiso sopra per non avere gli stessi nomi, ho rinominato il mio secondo modulo, chiamato da il primo e il problema risolto. Roba interessante! Grazie per le informazioni Artiso!

Nel caso in cui la mia esperienza non è chiaro:

Nome Modulo: AllFSGroupsCY Public Sub AllFSGroupsCY()

Nome Modulo: AllFSGroupsPY Public Sub AllFSGroupsPY()

Da AllFSGroupsCY()

Public Sub FSGroupsCY() 

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

End Sub 
Problemi correlati