Если у вас есть большое количество книг, которые вы хотите обработать с помощью макросов, у вас может возникнуть соблазн поместить макрос обработки в каждую книгу (как макрос 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), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (2278) относится к Microsoft Excel 97, 2000, 2002 и 2003. Вы можете найти версию этого совета для ленточного интерфейса Excel (Excel 2007 и более поздних версий) здесь:

link: / excelribbon-Running_a_Macro_in_a_Number_of_Workbooks [Запуск макроса в нескольких рабочих книгах].