Se si dispone di un numero sufficiente di cartelle di lavoro che si desidera elaborare tramite l’uso di macro, si potrebbe essere tentati di inserire la macro di elaborazione all’interno di ciascuna cartella di lavoro (come macro Auto_apri), quindi scrivere un tipo di routine per caricare ciascuna cartella di lavoro, a sua volta e salvarlo.

Anche se questo può sembrare buono in teoria, non funzionerà in pratica. Perché?

Perché quando apri una cartella di lavoro sotto il controllo macro, la macro Auto_Open nella cartella di lavoro che si apre non verrà eseguita automaticamente. Ci sono tre modi per aggirare questo problema.

Il primo è ripetere la macro in modo da non fare affidamento sulle macro Auto_Open in ogni cartella di lavoro. Se la macro Auto_Open in ogni cartella di lavoro è la stessa, perché non spostare semplicemente il codice in una procedura separata nella cartella di lavoro di controllo? Ad esempio, diciamo che stavi usando il codice che ha seguito questo processo:

Sub MyMacro()

Dim J As Integer     Dim sTarget As String

Application.ScreenUpdating = False     For J = 1 To 999         sTarget = "Book" & Format(J, "000") & ".xls"

Workbooks.Open sTarget         'Auto_Open runs here         Workbooks(sTarget).Save     Next J     Application.ScreenUpdating = True End Sub

Questo non funzionerà, per ragioni già spiegate. Una soluzione è spostare semplicemente il codice Auto_Open comune in un’altra procedura, quindi chiamarlo dopo aver aperto la cartella di lavoro, come mostrato qui:

Sub MyMacro()

Dim J As Integer     Dim sTarget As String

Application.ScreenUpdating = False     For J = 1 To 999         sTarget = "Book" & Format(J, "000") & ".xls"

Workbooks.Open sTarget         Workbooks(sTarget).Activate         DoCommonCode         Workbooks(sTarget).Save     Next J     Application.ScreenUpdating = True End Sub
Sub DoCommonCode()

'Common code goes here End Sub

Questo approccio funziona bene, a condizione che la routine sia la stessa che verrà eseguita su tutte le diverse cartelle di lavoro. Se le routine sono diverse in ogni cartella di lavoro, puoi forzare VBA a eseguire la macro Auto_Open. Questo viene fatto utilizzando il metodo RunAutoMacros subito dopo aver aperto le cartelle di lavoro:

Workbooks.Open sTarget ActiveWorkbook.RunAutoMacros xlAutoOpen

Dato questo approccio, potresti facilmente trovare una macro che aprirebbe semplicemente ogni cartella di lavoro (in modo che le macro Auto_Open possano essere eseguite) e quindi salvarle. Tale macro apparirà come segue:

Sub RunAutoOpenMacrosInBooks()

Dim J As Integer     Dim sTarget As String

Application.ScreenUpdating = False     For J = 1 To 999         sTarget = "Book" & Format(J, "000") & ".xls"

On Error Resume Next         Workbooks.Open sTarget         Windows(sTarget).Activate         With ActiveWorkbook             If .Name <> ThisWorkbook.Name Then                 .RunAutoMacros xlAutoOpen                 .Save                 .Close             End If         End With     Next i     Application.ScreenUpdating = True End Sub

Un terzo approccio, e anche migliore, consiste nel non fare affidamento sulle macro Auto_Open in ciascuna delle cartelle di lavoro. Affidati invece all’evento Workbook_Open come un modo per eseguire la tua macro. L’evento Workbook_Open viene attivato automaticamente, indipendentemente dal fatto che la cartella di lavoro venga aperta manualmente o in un’altra macro. Il codice contenuto nell’evento viene eseguito automaticamente, proprio come ci si aspetterebbe da una macro Auto_Open.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (1850) si applica a Microsoft Excel 2007, 2010 e 2013. Puoi trovare una versione di questo suggerimento per l’interfaccia del menu precedente di Excel qui: