Страница 1 из 1

Excel: простой вопрос по процедуре before_save

Добавлено: 04 апр 2011, 05:26
district
Уважаемые! Как-то задавал уже вопрос, но видимо слишком сложно получилось. Упрощаю до максимума. Буду признателен если кто пояснит возникшую проблему.

Существует две книги - книга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 обходить? Буду очень признателен - постоянно сталкиваюсь с этой проблемой и понять в чем суть никак не могу.

Re: Excel: простой вопрос по процедуре before_save

Добавлено: 04 апр 2011, 08:23
nilem
На всякий случай. Процедура before_save записана в модуле ЭтаКнига файла Книга2?
И еще м.б. это: Workbooks("Книга2.xls")

Re: Excel: простой вопрос по процедуре before_save

Добавлено: 04 апр 2011, 11:34
district
Да, разумеется - процедура before_save в модуле Эта Книга файла Книга2.
Изначально пример проверял в excel2007 (там без расширения vba все каким-то образом понимает). Но для пущей уверенности сейчас создал пример еще раз в 2003. Прописал c расширениями названия файлов. Ситуация повторилась - листы книга2 не активируются. Ошибок никаких при этом не выдается.

Re: Excel: простой вопрос по процедуре before_save

Добавлено: 05 апр 2011, 10:22
nilem
Обновление экрана включено?
Вообще, имхо, все делать из одной книги. Типа такого (в модуль файла Книга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

Re: Excel: простой вопрос по процедуре before_save

Добавлено: 08 апр 2011, 21:20
district
Спасибо! Про одну книгу в курсе, но меня интересует именно мой пример - где активация листов идет именно из save. В качестве примера привел прототип сложной процедуры, которую упростил до самого не хочу для наглядности. Возможно я не знаю каких-то команд или нюансов, которые позволяют-таки корректно выполняться моему коду. Типа как наличие run в обязательном порядке если обращаешься к приватной процедуре.

Re: Excel: простой вопрос по процедуре before_save

Добавлено: 08 апр 2011, 21:20
district
Обновление экрана включено. Вообще отрабатываю именно тот код что прописал.

Re: Excel: простой вопрос по процедуре before_save

Добавлено: 03 май 2011, 16:54
bobo
попробуйте сместо "activate" написать "select"

Re: Excel: простой вопрос по процедуре before_save

Добавлено: 04 май 2011, 08:51
SAS888
Можно во второй книге вынести код, который необходимо выполнять перед ее сохранением в отдельную процедуру в программный модуль. Например

Код: Выделить всё

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

Re: Excel: простой вопрос по процедуре before_save

Добавлено: 11 май 2011, 22:37
district
Спасибо, bobo. Select не помог. Ничего не изменилось.
Спасибо SAS. Собственно в сложной процедуре так и сделал. Но никто не объяснил почему excel так себя ведет в моем примере. Выглядит ведь все проще некуда, а решения прямого, получается, нет. В итоге нарисовывается серьезное ограничение для использования процедуры before_save: нельзя к ней обращаться из другого файла при условии, что в before_save этого прописана по тем или иным причинам активация листов родной книги. То же, видимо, касается и той же процедуры before_close.