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

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

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

Существует две книги - книга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 обходить? Буду очень признателен - постоянно сталкиваюсь с этой проблемой и понять в чем суть никак не могу.
nilem
Сообщения: 112
Зарегистрирован: 14 ноя 2008, 01:59
Откуда: Уфа

На всякий случай. Процедура before_save записана в модуле ЭтаКнига файла Книга2?
И еще м.б. это: Workbooks("Книга2.xls")
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Да, разумеется - процедура before_save в модуле Эта Книга файла Книга2.
Изначально пример проверял в excel2007 (там без расширения vba все каким-то образом понимает). Но для пущей уверенности сейчас создал пример еще раз в 2003. Прописал c расширениями названия файлов. Ситуация повторилась - листы книга2 не активируются. Ошибок никаких при этом не выдается.
nilem
Сообщения: 112
Зарегистрирован: 14 ноя 2008, 01:59
Откуда: Уфа

Обновление экрана включено?
Вообще, имхо, все делать из одной книги. Типа такого (в модуль файла Книга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
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Спасибо! Про одну книгу в курсе, но меня интересует именно мой пример - где активация листов идет именно из save. В качестве примера привел прототип сложной процедуры, которую упростил до самого не хочу для наглядности. Возможно я не знаю каких-то команд или нюансов, которые позволяют-таки корректно выполняться моему коду. Типа как наличие run в обязательном порядке если обращаешься к приватной процедуре.
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

Обновление экрана включено. Вообще отрабатываю именно тот код что прописал.
bobo
Сообщения: 8
Зарегистрирован: 06 янв 2011, 09:07

попробуйте сместо "activate" написать "select"
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

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

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

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
district
Сообщения: 56
Зарегистрирован: 13 ноя 2007, 23:03
Откуда: Москва

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