在多个工作簿中运行宏(Microsoft Excel)
如果您想使用宏来处理大量工作簿,则可能会想将处理宏放置在每个工作簿中(作为Auto_Open宏),然后编写某种例程来加载每个工作簿,依次保存。
尽管从理论上讲这听起来不错,但实际上却行不通。为什么?
因为当您在宏控制下打开工作簿时,正在打开的工作簿中的Auto_Open宏将不会自动运行。有三种方法可以解决此问题。
第一种是重做宏,这样您就不必依赖每个工作簿中的Auto_Open宏。如果每个工作簿中的Auto_Open宏都相同,那么为什么不简单地将代码移动到控制工作簿中的单独过程中呢?例如,假设您正在使用遵循此过程的代码:
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
由于已经说明的原因,这将不起作用。一种解决方案是将普通的Auto_Open代码简单地移到另一个过程中,然后在打开工作簿后调用它,如下所示:
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
只要例程将在所有不同的工作簿上运行,该方法就可以正常工作。如果每个工作簿中的例程都不同,则可以强制VBA运行Auto_Open宏。这是通过在打开工作簿后立即使用RunAutoMacros方法完成的:
Workbooks.Open sTarget ActiveWorkbook.RunAutoMacros xlAutoOpen
使用这种方法,您可以轻松地创建一个宏,该宏将简单地打开每个工作簿(以便Auto_Open宏可以运行)然后保存它们。这样的宏如下所示:
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
第三种,甚至更好的方法是不依赖每个工作簿中的Auto_Open宏。而是,依靠Workbook_open事件作为运行宏的一种方式。无论工作簿是手动打开还是在另一个宏中打开,都会自动触发Workbook_open事件。该事件包含的代码会自动运行,就像您对Auto_Open宏所期望的那样。
注意:
如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。
_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。
本技巧(2278)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: