Страницы: 1
RSS
Workbooks().Close False ' не отрабатывает, при том что объект существует
 
123.xlsm - базовый файл. Открываем именно его.
Он в свою очередь открывает еще 2 файла (kruc.xlam и krud.xlsm).
В файле krud.xlsm указаны прайсы, которые тот должен открыть в свою очередь.

Открывается всё прекрасно. Как надо. А вот при закрытии ни один из прайсов не закрывается. Понять не могу почему. Нужна помощь светлых голов.
В файле krud.xlsm есть строчка:
Код
Workbooks(arr(ub)).Close False ' если закрыть 123.xlsm, то эта строчка не отработает

Она не отрабатывает, хоть объект и есть.

123.xlsm - клиентский файл
krud.xlsm - файл с данными
kruс.xlam - файл с макросами
Прайс1.xls - прайс
Прайс2.xlsx - прайс
Прайс3.xlsm - прайс
Прайс4.xlsb - прайс
 
Цитата
kefirko написал:
если закрыть 123.xlsm, то эта строчка не отработает
может потому, что в 123 прописано при закрытии так же закрыть и krud.xlsm?
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    
    Workbooks("kruc.xlam").Close False
    Workbooks("krud.xlsm").Close False
End Sub
Вы там с порядком событий как-то разберитесь, что ли...
Или в krud в цикле по книгам ставьте Application.EnableEvents = false. Только в true по окончании процедуры вернуть не забудьте. И проверьте - будет ли от этого эффект.
Изменено: Дмитрий(The_Prist) Щербаков - 21.10.2020 20:57:29
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
может потому, что в 123 прописано при закрытии так же закрыть и krud.xlsm?
Так всё же логично!?
123 пытается закрыть krud. В krud отрабатывает BeforeClose и в свою очередь закрывает 4 прайса. После этого закрывается сам.

Цитата
Дмитрий(The_Prist) Щербаков написал:
Вы там с порядком событий как-то разберитесь, что ли...
По F8 пробегал. Всё ровно в нужном порядке работает (как мне кажется).

Цитата
Дмитрий(The_Prist) Щербаков написал:
Или в krud в цикле по книгам ставьте Application.EnableEvents = false. Только в true по окончании процедуры вернуть не забудьте. И проверьте - будет ли от этого эффект.
Не помогло. На скрине следующий шаг после закрытия. Книга на месте.
 
Раз объект есть, но не отрабатывает - значит его что-то держит. Попробуйте отказаться от извратов вроде IsAddin = True для файлов, которые не являются надстройками. И скрывать их, например, так:
Код
If IsEmpty(Workbooks(arr(ub))) Then
            Workbooks.Open ThisWorkbook.Path & "\" & arr(ub), , True
            Workbooks(arr(ub)).Windows(1).Visible = False
        End If
Плюс, вот это:
Код
IsEmpty(Workbooks(arr(ub)))
не очень правильно. Лучше проверяйте хотя бы циклом: Как проверить открыта ли книга?

И все же просмотрите свои события более тщательно. У Вас сначала идет закрытие файла kruc, в котором Вы пытаетесь закрыть все Прайсы, а потом идет закрытие krud, в котором опять идет закрытие всех прайсов. Без какой-либо проверки на то, открыты ли они. Это в любом случае неправильно.
И в моменты отладки оставляйте показ сообщений(я про DisplayAlerts). Если увидите, что это действительно нужно и все работает - тогда и добавляйте.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Упростил до примитивного. Результат тот же. Книга3 всегда остается открытой.

Книга1 - исходный документ. Он запускает Книга2, тот в свою очередь Книга3.
При закрытии Книга1 должна сначала закрыться Книга3, потом Книга2 и потом сама Книга1.

P.S. Запихал в BeforeClose Книги3 один msgbox. Так вот выяснилось, что события в книге3 не срабатывают при закрытии, а вот при открытии все срабатывает.
 
Цитата
kefirko написал:
события в книге3 не срабатывают при закрытии
все срабатывает. Вывод: где-то у Вас есть надстройка, которая влияет на все это. Отключите все надстройки от Excel и проверяйте работу кода.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
У меня пусто. Нечему влиять. См. ниже.

Код
MsgBox "Книга 3 закрывается"
Срабатывает? Окно выскакивает? Точно?
Изменено: kefirko - 22.10.2020 10:34:44
 
Цитата
kefirko написал:
Нечему влиять
тогда я бы на Вашем месте не делал бы вообще тогда сложные цепочки событий(да я и не делаю). Скорее всего уже на второй итерации Excel просто отказывается обрабатывать вложенные события.
Есть одна книга с кодом - она и должна быть основной. Все остальные - просто делают что-то, если основная не открыта(например открывают её или выполняют некие функции), либо ничего не делают.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
все срабатывает
Немного не так.
На примере моей недавней заморочки.
Имеется шаблон xltm, в событии Workbook_BeforeSave которого прописано сохранение книги методом SaveAs.
При попытке сохранить сей файл кодом из надстройки методом Save событие Workbook_BeforeSave возникает, макрос открывает диалог, отрабатывает от начала и до конца без ошибок. Одна беда - книга не сохраняется.
Пришлось дублировать в надстройку SaveAs.
Полагаю, что эта проблема, и проблема ТС - одного поля ягода, и скрыта она где-то глубоко в недрах Excel.
 
Цитата
RAN написал:
Немного не так
я вот так делал
Цитата
kefirko написал:
Запихал в BeforeClose Книги3 один msgbox. Так вот выяснилось, что события в книге3 не срабатывают при закрытии, а вот при открытии все срабатывает.
по сути не совсем корректно написано. Надо было сразу написать, что оно не срабатывает, только если закрывать пробовать через закрытие Книга1. А самостоятельно событие в Книга3 отрабатывает на ура.
Но проблема да, в самом Excel - написал уже выше: вероятно на какой-то итерации Excel отказывается обрабатывать вложенные события.
Изменено: Дмитрий(The_Prist) Щербаков - 22.10.2020 10:48:39
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
RAN написал:
где-то глубоко в недрах Excel
Похоже на то. Спасибо за ответ.

Цитата
Дмитрий(The_Prist) Щербаков написал:
по сути не совсем корректно написано
Да. Согласен. Не очень понятно. Надо именно Книга1 закрывать и ждать когда отработает событие из Книга3.

Спасибо всем.
Страницы: 1
Наверх