Excel: простой вопрос по процедуре before_save
Модератор: Naeel Maqsudov
Уважаемые! Как-то задавал уже вопрос, но видимо слишком сложно получилось. Упрощаю до максимума. Буду признателен если кто пояснит возникшую проблему.
Существует две книги - книга1 и книга2.
Книга1 содержит обычный модуль с кодом:
Workbooks("Книга2").Activate
Workbooks("Книга2").Save
Книга2 содержит код в процедуре before_save:
ThisWorkbook.Sheets(1).Activate
ThisWorkbook.Sheets(2).Activate
Запускаю в пошаговом режиме код книги1 и вижу, что код книги2 не работает - лист1 не выделяется (впрочем и 2 тоже). При этом vba ведет себя как ни в чем не бывало - никаких сообщений об ошибках - курсор просто шагает на следующую строку кода.
Кто-нибудь знает как сей секрет процедуры save обходить? Буду очень признателен - постоянно сталкиваюсь с этой проблемой и понять в чем суть никак не могу.
Существует две книги - книга1 и книга2.
Книга1 содержит обычный модуль с кодом:
Workbooks("Книга2").Activate
Workbooks("Книга2").Save
Книга2 содержит код в процедуре before_save:
ThisWorkbook.Sheets(1).Activate
ThisWorkbook.Sheets(2).Activate
Запускаю в пошаговом режиме код книги1 и вижу, что код книги2 не работает - лист1 не выделяется (впрочем и 2 тоже). При этом vba ведет себя как ни в чем не бывало - никаких сообщений об ошибках - курсор просто шагает на следующую строку кода.
Кто-нибудь знает как сей секрет процедуры save обходить? Буду очень признателен - постоянно сталкиваюсь с этой проблемой и понять в чем суть никак не могу.
На всякий случай. Процедура before_save записана в модуле ЭтаКнига файла Книга2?
И еще м.б. это: Workbooks("Книга2.xls")
И еще м.б. это: Workbooks("Книга2.xls")
Да, разумеется - процедура before_save в модуле Эта Книга файла Книга2.
Изначально пример проверял в excel2007 (там без расширения vba все каким-то образом понимает). Но для пущей уверенности сейчас создал пример еще раз в 2003. Прописал c расширениями названия файлов. Ситуация повторилась - листы книга2 не активируются. Ошибок никаких при этом не выдается.
Изначально пример проверял в excel2007 (там без расширения vba все каким-то образом понимает). Но для пущей уверенности сейчас создал пример еще раз в 2003. Прописал c расширениями названия файлов. Ситуация повторилась - листы книга2 не активируются. Ошибок никаких при этом не выдается.
Обновление экрана включено?
Вообще, имхо, все делать из одной книги. Типа такого (в модуль файла Книга1):
Вообще, имхо, все делать из одной книги. Типа такого (в модуль файла Книга1):
Код: Выделить всё
Sub tyutyu()
Dim wb As Workbook
Set wb = Workbooks("Книга2")
With wb
With .Sheets(1)
.Activate: .[a1] = 654: MsgBox .Name
End With
With .Sheets(2)
.Activate: .[a1] = 987: MsgBox .Name
End With
.Save
End With
End Sub
Спасибо! Про одну книгу в курсе, но меня интересует именно мой пример - где активация листов идет именно из save. В качестве примера привел прототип сложной процедуры, которую упростил до самого не хочу для наглядности. Возможно я не знаю каких-то команд или нюансов, которые позволяют-таки корректно выполняться моему коду. Типа как наличие run в обязательном порядке если обращаешься к приватной процедуре.
Обновление экрана включено. Вообще отрабатываю именно тот код что прописал.
попробуйте сместо "activate" написать "select"
Можно во второй книге вынести код, который необходимо выполнять перед ее сохранением в отдельную процедуру в программный модуль. Например
Тогда макросом из первой книги выполнять этот код отдельной командой перед ее сохранением:
Код: Выделить всё
Sub Main()
ThisWorkbook.Sheets(1).Activate
ThisWorkbook.Sheets(2).Activate
End Sub
Код: Выделить всё
Sub qq()
Workbooks("Книга2.xls").Activate
Application.Run "Книга2.xls!Main"
Workbooks("Книга2.xls").Save
End Sub
Спасибо, bobo. Select не помог. Ничего не изменилось.
Спасибо SAS. Собственно в сложной процедуре так и сделал. Но никто не объяснил почему excel так себя ведет в моем примере. Выглядит ведь все проще некуда, а решения прямого, получается, нет. В итоге нарисовывается серьезное ограничение для использования процедуры before_save: нельзя к ней обращаться из другого файла при условии, что в before_save этого прописана по тем или иным причинам активация листов родной книги. То же, видимо, касается и той же процедуры before_close.
Спасибо SAS. Собственно в сложной процедуре так и сделал. Но никто не объяснил почему excel так себя ведет в моем примере. Выглядит ведь все проще некуда, а решения прямого, получается, нет. В итоге нарисовывается серьезное ограничение для использования процедуры before_save: нельзя к ней обращаться из другого файла при условии, что в before_save этого прописана по тем или иным причинам активация листов родной книги. То же, видимо, касается и той же процедуры before_close.