Ejecución de una macro en varios libros de trabajo (Microsoft Excel)
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]
.