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