如果您想使用宏来处理大量工作簿,则可能会想将处理宏放置在每个工作簿中(作为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及更高版本)找到本技巧的版本: