|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Есть документ, в котором перед его закрытием запускается форма из подключенного шаблона. После того как форма отрабатывает свои действия/взаимодествия с юзером в документе сохраняются все последние изменения и он закрывается. Все бы ничего, но на форме имеется кнопка "Отмена", чтобы пользователь мог закрыть эту форму и продолжить что-то изменять в документе, если это ему необходимо. Как вычислить и остановить процесс выполнения дальнейшего кода, а именно закрытие документа, если на форме юзер выбрал именно эту кнопку "Отмена" или нажал крестик для закрытия формы? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2016, 21:51 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Как отслеживается закрытие документа? У Application.DocumentBeforeClose есть параметр Cancel. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2016, 22:43 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.ProКак отслеживается закрытие документа? У Application.DocumentBeforeClose есть параметр Cancel. В документе "А" я запускаю форму, которая находится в другом подключенном шаблоне: Код: vbnet 1. 2. 3. 4. 5. 6.
По идее мне нужно как то отследить каким образом была закрыта форма из шаблона и сделать в док."А" условие типа: если на форме была нажата кнопка "Отмена" или крестик в углу, то документ не закрывать. Но как это сделать, если форма запускается из другого шаблона и даже если кнопка "Отмена" или крестик в углу отрабатывают свое как надо, то после того как она закрывается, код в процедуре док."А" продолжает выполнять далее свой код. Я не понимаю как сделать это условие? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2016, 13:04 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Неужели без вариантов вычислить какая кнопка на форме была нажата юзером и передать значение из шаблона в другой файл сторонний, чтобы сделать условие? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2016, 17:34 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Попробуйте запустить MyProcedure с параметром и передать ответ через этот параметр ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2016, 11:35 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.ProПопробуйте запустить MyProcedure с параметром и передать ответ через этот параметр Можете дать пример? Не уверена, что моя идея хорошая, но сейчас пытаюсь сделать такой вариант, когда получаю соответствующий нужный мне параметр, запускаю теперь уже Application.Run из шаблона обратно в документ, но не получается реализовать, потому что формат документа без хранения модулей в нем. Непонятно как запускать Application.Run для процедур, которые находятся в самом объекте документа? А согласно справке Application.Run Method: Application.Run "Normal. Module1 .MAIN" Application.Run "MyProject. MyModule .MyProcedure" Application.Run "'My Document.doc'! ThisModule .ThisProcedure" Другого варианта я больше не нахожу. Хотя хотелось бы сделать, чтобы можно было при запуске Run сразу возвращать нужный вычисленный параметр, а так получается хождение с вычислением и переносом 1 разъединого параметра из документа в проект шаблона + из шаблона в документ, затем возврат обратно в шаблон, чтобы вернуться в документ. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 16:38 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
nataxa23А согласно справке Application.Run Method:А согласно справке: The Run method returns whatever the called macro returns Вы пробовали возвращать какое-то значение? Не получилось? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 16:48 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.Pronataxa23А согласно справке Application.Run Method:А согласно справке: The Run method returns whatever the called macro returns Вы пробовали возвращать какое-то значение? Не получилось? Если я делаю в процедуре самого документа: Код: vbnet 1. 2. 3. 4. 5.
всегда возвращается False даже, когда в процедуре шаблона вычислено True. Что я делаю не так в данном случае? ______________________ А вот, если пытаться пробовать мой вариант, т.е. из шаблона, вычислив значение параметра, запустить обратно процедуру Run в документ, то здесь я не могу понять как указать параметр "MacroName" для Run, иначе возникает ошибка 438. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 18:57 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
nataxa23 Код: vbnet 1.
а как выглядит процедура? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 19:21 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.Pronataxa23 Код: vbnet 1.
а как выглядит процедура? процедура в шаблоне выглядит так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 20:57 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
nataxa23всегда возвращается False даже, когда в процедуре шаблона вычислено True.nataxa23процедура в шаблоне выглядит так: Код: vbnet 1.
и как, простите, эта процедура возвращает True и где оно вычислено? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 21:36 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
nataxa23Что я делаю не так в данном случае?Ваша процедура должна быть как минимум function, чтобы что-то возвращать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 21:36 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.Pronataxa23Что я делаю не так в данном случае?Ваша процедура должна быть как минимум function, чтобы что-то возвращать. Из файла я запускаю процедуру "Sub Контроль()", которая в свою очередь запускает форму. Если юзер нажимает кнопку "Отмена" или "Х" на форме, функция GetResult возвращает мне True. В процедуре вот на этом условии, если оно срабатывает как True, мне нужно дальше как то передать параметр в документ, который я не могу никак передать: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
или я что то упускаю, только не могу понять что именно и где именно? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 22:18 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
nataxa23или я что то упускаю Код: vbnet 1. 2.
Откуда в GetFormResult возьмется True? Ее должна возвратить процедура "Процедура", которую надо оформить в виде функции ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 22:28 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Потому я и говорю, что не понимаю как ее вернуть от туда - из шаблона. И еще, если в шаблоне я процедуру переделываю на функцию, то в коде документа тогда возникает ошибка: -2147352573. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 22:45 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
nataxa23в коде документа тогда возникает ошибка: -2147352573.Сама по себе переделка Sub на Function не должна приводить ни к каким ошибкам. Код ошибки мне тоже ничего не говорит - думаете мы наизусть знаем все коды ошибок? Текст давайте. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 23:00 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Впрочем, возможно Application.Run действительно не может вызывать функцию.... Runs a macro or calls a function. This can be used to run a macro written in Visual Basic or the Microsoft Excel macro language, or to run a function in a DLL or XLL. не очень ясно ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 23:05 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Специально проверил - все нормально работает. Не знаю, что вы там у себя наворотили. Код: vbnet 1. 2. 3. 4. 5.
Код: vbnet 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2016, 23:19 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.Pro, все разобралась с передачей параметра в документ, спасибо Вам большое. Осталось теперь понять причину, по которой в процедуре "Private Sub Document_Close()" при моем условии почему то команда End не выполняется, т.е. когда документ закрывать не нужно, он все равно закрывается? В это я как то не предвидела. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2016, 17:39 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
А с чего вы решили, что End должно отменить закрытие документа? Как я писал с самого начала - нужно обрабатывать событие Application.DocumentBeforeClose, в котором присваивать Cancel=True, если требуется отменить закрытие документа ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2016, 22:34 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.ProКак я писал с самого начала - нужно обрабатывать событие Application.DocumentBeforeClose, в котором присваивать Cancel=True, если требуется отменить закрытие документа А Вы можете дать пример как его вызвать? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2016, 21:16 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Нужно добавить класс и в нем написать Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Но перед использованием переменную App нужно где-то инициализировать, например при открытии документа Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2016, 22:24 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.ProНо перед использованием переменную App нужно где-то инициализировать, например при открытии документа Код: vbnet 1.
Класс добавлен и согласно Вашему примеру в процедуру Document_Close добавлена так же эта строка, но дальше то что? Я понять не могу никак??? Мне же надо вызвать это событие, я не понимаю как? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2016, 22:34 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
nataxa23Мне же надо вызвать это событие, я не понимаю как?Так оно само вызывается при закрытии любого документа Shocker.Proпеременную App нужно где-то инициализировать, например при открытии документаnataxa23в процедуру Document_Close добавлена так же эта строкаDocument_Close вызывается после App_DocumentBeforeClose, так что туда добавлять бесполезно, нужно раньше, как я сказал, например при открытии документа. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2016, 23:04 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.Pronataxa23Мне же надо вызвать это событие, я не понимаю как?Так оно само вызывается при закрытии любого документа Shocker.Proпеременную App нужно где-то инициализировать, например при открытии документаnataxa23в процедуру Document_Close добавлена так же эта строкаDocument_Close вызывается после App_DocumentBeforeClose, так что туда добавлять бесполезно, нужно раньше, как я сказал, например при открытии документа. Хорошо, перенесла строку в процедуру: Код: vbnet 1. 2. 3.
Открываю документ нажимаю например Ctrl+W, чтобы его закрыть - документ как закрывался, так и продолжает закрываться. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2016, 17:53 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
выложите документ ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2016, 17:54 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.Proвыложите документ Отправила Вам на Email файлы. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2016, 21:18 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
У меня нет желания разбираться в ворохе файлов и кода. Прикладываю файл с иллюстрацией того, что я описал выше. Я немного перемудрил с классом, достаточно все это сделать просто в модуле. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2016, 21:32 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.Pro, Спасибо большое за пример, мне он очень помог с ориентироваться, не знаю правда на сколько уж профессионально у меня все получилось, но работает. Единственный еще правда вопрос возник по ходу, в посте выше Вы дали мне очень полезное и ценное разъяснение, что оказалось для меня немаловажно, что Document_Close вызывается после App_DocumentBeforeClose. Скажите, событие Quit срабатывает же по идее после App_DocumentBeforeClose, верно? И можно ли как то тогда вычислить как каким образом юзер закрывает документ? Например, жмет Ctr+W, т.е. оболочка ворда остается, а документ закрывается, или же юзер нажимает крестик в углу оболочки ворда и если открыт только один документ, то он соответственно закрывается вместе с оболочкой ворда. Просто хотелось бы реализовать вот такую еще вещь, что если закрывается полностью оболочка ворда, то предварительно молча выгружается подключенный шаблон. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 22:35 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Quit возникает естественно после закрытия всех документов и возникает именно при закрытии оболочки. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 22:42 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.Proвозникает именно при закрытии оболочки. так вот и вопрос то в том, как понять заранее, что юзер закрывает не только все открытые док. но и саму оболочку? Потому что в ворде нет отдельной кнопки для закрытия каждого документа. Начиная с 2007 версии и выше они убрали эту кнопку и теперь пользователи жмут общий "Х" на самой оболочке. Получается что Quit при закрытии последнего док. просто не срабатывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2016, 17:54 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
nataxa23Получается что Quit при закрытии последнего док. просто не срабатывает.Это утверждение или вопрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2016, 20:48 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.Pronataxa23Получается что Quit при закрытии последнего док. просто не срабатывает.Это утверждение или вопрос? Просто мысли в слух, пытаюсь думать логически, так сказать. :) Но я вроде уже нашла в чем моя ошибка. Дело в том, в прошлый раз я событие DocumentBeforeClose я прописала в самом файле, следовательно по этой причине я пришла к такому рассуждению. Сегодня сделала иначе, прописала DocumentBeforeClose, а так же Quit непосредственно в сам шаблон. И теперь все выполняется, и пока что я ошибок не наблюдаю. Кроме правда одной: Ошибка № 5825 : " Объект был удален. " Возникать она начала, если я начинаю тестить экспериментируя, чтобы по возможности сразу предугадать как юзер может пытаться (косячно/некосячно) открывать файл. Вот и здесь она соответственно вылезла тогда, когда если повторно будет происходить запуск моего шаблона. Т.е., если мой шаблон был уже подключен раньше, то при попытке запустить его повторно выходит ошибка 5825. Других косяков я пока не получаю, может потому что тестю пока только на своем компе, по себе знаю, как запустишь на другом, так еще что то вылезет. Но я что то эту ошибку сейчас понять не могу, чтобы исправить. Такое чувство, что на процедуре Document_New и Document_Open нужно делать проверку подключен ли уже мой шаблон. Косяк срабатывает на процедурах Document_New и Document_Open, после того как нажимаю на своей стартовой спец.форме ок или exit при повторном запуске. Есть ли у Вас мысли по этому поводу??? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.05.2016, 23:13 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
на какой строке возникает ошибка? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2016, 01:13 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Shocker.Proна какой строке возникает ошибка? Вот как назло определить не получается - пошагово не запустишь, это происходит на этапе, когда открывается основной файл, из него кодом я открываю файл - проект шаблона. Когда запускается шаблон то вначале появляется стартовая форма, чтобы юзер мог сделать выбор подключать ему шаблон или нет. И во тут, независимо от выбора юзера, после того как добавлены события DocumentBeforeClose и Quit, вот после этого уже и стала возникать эта ошибка. Еще вариант, когда она возникает - это, если шаблон запускать вторично просто отдельно от основного файла (из папки, где он лежит, рядом с основным файлом) и если шаблон предварительно ранее уже был подключен в шаблонах и настройках в ворде, т.е. запустить его как бы повторно на это самое подключение, то возникает точно также эта ошибка. К тому же еще после этой ошибки ворд начинает падать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2016, 11:08 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
nataxa23, Одно понятно точно, что ошибка возникает на строке, когда я пытаюсь делать инициализацию. Код: vbnet 1.
Просто сделала сейчас тупой эксперимент и из процедур Document_New и Document_Open, где эта строка была прописана, я перенесла ее в другую процедуру, ошибка сработала уже из нее. Следовательно, ошибка возникает именно на этой строке при повторном запуске, когда идет попытка инициализации. После чего ворд еще и падает. В шаблоне класс я создавала как описано в справке . ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2016, 11:44 |
|
VBA Word - Вычислить и остановить закрытие документа
|
|||
---|---|---|---|
#18+
Пытаюсь все таки понять и разобраться с инициализацией. Ошибка 5825 возникает, если инициализацию делать после стартовой формы при запуске шаблона. Эта ошибка перестает возникать, если инициализацию делать перед стартовой формой в шаблоне. Т.е. по логике вначале идет инициализация, а потом стартует форма приветствия. Но тогда возникает другой момент, если юзер на форме выбирает кнопку exit - закрывается форма, а следом за ней и шаблон без подключения, а основной файл (который собственно отвечает за запуск шаблона) остается открытым. При повторном запуске инициализация уже не происходит , не могу понять почему? Больше того, если закрыть все открытые файлы, но оболочку не закрывать и пытаться открыть по новой запустив основной файл, который вызовет снова форму и уже подключит шаблон, то инициализации так же не происходит. Т.е. после первого отката, приходится закрывать всю оболочку ворда, чтобы произошла инициализация. Что в этом случае мешает инициировать при повторном открытии? Не могу никак понять как добиться. Запуск шаблона из основного файла делаю так: Код: vbnet 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2016, 19:29 |
|
|
start [/forum/topic.php?all=1&fid=60&tid=2155523]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 174ms |
0 / 0 |