Si tiene una gran cantidad de libros de trabajo que desea procesar mediante el uso de macros, puede tener la tentación de colocar la macro de procesamiento dentro de cada libro de trabajo (como una macro Auto_Open), y luego escribir algún tipo de rutina para cargar cada libro de trabajo, a su vez, y guárdelo.

Si bien esto puede sonar bien en teoría, no funcionará en la práctica. ¿Por qué?

Porque cuando abre un libro bajo control de macros, la macro Auto_Open en el libro que se abre no se ejecutará automáticamente. Hay tres formas de solucionar este problema.

La primera es rehacer su macro para que no dependa de las macros Auto_Open en cada libro de trabajo. Si la macro Auto_Open en cada libro de trabajo es la misma, entonces ¿por qué no simplemente mover el código a un procedimiento separado en el libro de control? Por ejemplo, digamos que estaba usando código que siguió este proceso:

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

Esto no funcionará, por las razones ya explicadas. Una solución es simplemente mover el código común Auto_Open a otro procedimiento y luego llamarlo después de abrir el libro de trabajo, como se muestra aquí:

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

Este enfoque funciona bien, siempre que la rutina sea la misma que se ejecutará en todos sus diferentes libros de trabajo. Si las rutinas son diferentes en cada libro de trabajo, puede forzar a VBA a ejecutar la macro Auto_Open. Esto se hace usando el método RunAutoMacros justo después de abrir los libros de trabajo:

Workbooks.Open sTarget ActiveWorkbook.RunAutoMacros xlAutoOpen

Dado este enfoque, podría crear fácilmente una macro que simplemente abriera cada libro de trabajo (para que se pudieran ejecutar las macros Auto_Open) y luego guardarlas. Tal macro aparecería como sigue:

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 tercer enfoque, e incluso mejor, es no depender de las macros Auto_Open en cada uno de sus libros de trabajo. En su lugar, confíe en el evento Workbook_Open como una forma de ejecutar su macro. El evento Workbook_Open se activa automáticamente, independientemente de si el libro se abre manualmente o en otra macro. El código que contiene el evento se ejecuta automáticamente, tal como cabría esperar de una macro Auto_Open.

_Nota: _

Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.

link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador].

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (1850) se aplica a Microsoft Excel 2007, 2010 y 2013. Puede encontrar una versión de este consejo para la interfaz de menú anterior de Excel aquí:

link: / excel-Running_a_Macro_in_a_Number_of_Workbooks [Ejecución de una macro en varios libros de trabajo].