2010-03-11 16 views
8

Quindi ho un MDB MSAccess che deve aprire altri MDB ed eseguire un gruppo di codice che confronterà due MDB di Access per trovare differenze di codice, query diff, ecc. L'obiettivo è quello di verificare che l'MDB di produzione non sia stato modificato rispetto alla distribuzione originale.Come saltare la macro Autoexec quando si apre MSAccess da MSAccess?

Il mio problema è che molte di queste app di Access hanno macro Autoexec e non esiste un modo semplice per chiamare .OpenCurrentDatabase senza eseguire la macro autoexec.

Come posso saltare la macro utilizzando CODICE?

So che posso tenere premuto il tasto Maiusc. So che posso attivare e disattivare anche questa opzione.

risposta

4

È una soluzione subdola ma funziona per me.

Faccio un DoCmd.DatabaseTransfer acImport della macro Autoexec. Poi si sostituisce l'autoexec con uno vuoto, utilizzando DoCmd.DatabaseTransfer acExport

Il trucco è che un Export sarà sovrascrive

DoCmd.TransferDatabase acImport, "Microsoft Access", sSourcePath , acMacro, "autoexec", "autoexecSource"

DoCmd.TransferDatabase acExport, "Microsoft Access", sSourcePath, acMacro, "autoexecblank", "autoexec"

lo faccio di nuovo per la seconda MDB

DoCmd.TransferDatabase acImport, "Microsoft Access", sDestPath, acMacro, "autoexec", " autoexecDest"

DoCmd.TransferDatabase acExport, "Microsoft Access", sDestPath, acMacro, "autoexecblank", "autoexec"

Allora posso fare tutti i confronti per la ricerca di diff tra i due MDBs senza attivare le macro AutoExec da quando li ho importato e sostituito loro

Poi metto a confronto le due macro ho importato e quindi esportare di nuovo ai database.

DoCmd.TransferDatabase acExport, "Microsoft Access", sSourcePath, acMacro, "autoexecSource", "autoexec"

DoCmd.TransferDatabase acExport, "Microsoft Access", sDestPath, acMacro, " autoexecDest "," autoexec "

Ovviamente questa soluzione funziona solo utilizzando VBA in Access, ma funziona.

Spero che questo aiuti qualcuno.

+0

molto subdolo :) +1 – Praesagus

5

Codice run all'avvio potrebbe non essere in una macro AutoExec, può essere in una forma di avvio, di conseguenza, si può prendere in considerazione 'premendo a livello di codice il passaggio-chiave' tramite API:

http://www.mvps.org/access/api/api0068.htm

+0

Questa dovrebbe essere la risposta accettata. – transistor1

2

Un'altra opzione se si ha accesso a modificare le macro AutoExec dei database che si stanno aprendo: impostare una condizione su ogni passaggio della macro che specifica [Application].[UserControl]. Specificando ciò, il passaggio macro verrà eseguito solo se il database viene aperto da un utente, non tramite l'automazione. Se il passaggio macro ha già impostato una condizione, è possibile posizionare semplicemente la parentesi: (old condition) AND [Application].[UserControl].

Se non si è in grado di modificare tali macro, tuttavia, è meglio seguire la soluzione di @ ChuckB.

0

Questa è una vecchia domanda, ma un altro modo per farlo sarebbe utilizzare l'argomento della riga di comando/cmd e utilizzare un'istruzione COMMAND nell'avvio dell'app per eseguire in modo condizionale le routine di avvio a seconda che esistesse un argomento/cmd fornito . Ciò funzionerebbe solo con un avvio della riga di comando, tuttavia, non tramite l'automazione.

2

Un'altra opzione: rinominare la macro autoexec nel codice VB.

OpenCurrentDatabase ("Il database")

DoCmd.Rename "Autoexec", acMacro, "tmp_Autoexec"

CloseCurrentDatabase

Dopo aver fatto la vostra azione non una ridenominazione di nuovo a autoexec nuovo ... et voila ....

+1

Non 'OpenCurrentDatabase' causa l'esecuzione della macro Autoexec (* prima * viene raggiunta la riga' DoCmd.Rename')? – Heinzi

Problemi correlati