Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
4 / 4 / 0
Регистрация: 16.10.2014
Сообщений: 135
1

Событие сохранения документа для Word

16.10.2014, 10:04. Показов 6908. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В VBA для Word не обнаружил событие сохранения документа. Вот в VBA для Excel есть событие Workbook_BeforeSave. Как быть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2014, 10:04
Ответы с готовыми решениями:

Защита документа word. (без сохранения, без копирования)
Доброго времени суток. Хочу сначала поблагодарить участников форума за помощь в моим предыдущих...

VBA Word. Макрос для сохранения слияния
Всем привет! всю историю описывать не буду... но на текущем этапе у меня есть файл в экселе...

Как указать Word'у каталог для сохранения файлов
Открываю документ, выполняя 'Save As..' сохраняю документ в другом каталоге, закрываю Word. ...

Ошибка сохранения документа WORD
Всем привет! Работаю над созданием отчёта в WORD, и столкнулся с такой ошибкой: после добавления 5...

9
Заблокирован
16.10.2014, 10:13 2
Цитата Сообщение от F1
DocumentBeforeSave Event
Occurs before any open document is saved.

Visual Basic
1
Private Sub object_DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
object An object of type Application declared with events in a class module. For more information about using events with the Application object, see Using Events with the Application Object.

Doc The document that's being saved.

SaveAsUI True to display the Save As dialog box.

Cancel False when the event occurs. If the event procedure sets this argument to True, the document isn't saved when the procedure is finished.

Example
This example prompts the user for a yes or no response before saving any document. This code must be placed in a class module, and an instance of the class must be correctly initialized in order to see this example work; see Using Events with the Application Object for directions on how to accomplish this.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public WithEvents appWord as Word.Application
 
Private Sub appWord_DocumentBeforeSave _
        (ByVal Doc As Document, _
        SaveAsUI As Boolean, _
        Cancel As Boolean)
 
    Dim intResponse As Integer
 
    intResponse = MsgBox("Do you really want to " _
        & "save the document?", _
        vbYesNo)
 
    If intResponse = vbNo Then Cancel = True
End Sub
...
0
4 / 4 / 0
Регистрация: 16.10.2014
Сообщений: 135
16.10.2014, 11:00  [ТС] 3
Спасибо.
Пробую object_DocumentBeforeSave, appWord_DocumentBeforeSave и просто DocumentBeforeSave, событие не срабатывает. Ведь в Excel'е до Workbook_BeforeSave ничего не нужно было писать. Может просветите что нужно писать вместо object для текущего документа?
0
Заблокирован
16.10.2014, 11:13 4
Using Events with the Application Object
To create an event handler for an event of the Application object, you need to complete the following three steps:

1. Declare an object variable in a class module to respond to the events.
2. Write the specific event procedures.
3. Initialize the declared object from another module.

Declare the Object Variable
Before you can write procedures for the events of the Application object, you must create a new class module and declare an object of type Application with events. For example, assume that a new class module is created and called EventClassModule. The new class module contains the following code.

Visual Basic
1
Public WithEvents App As Word.Application
Write the Event Procedures
After the new object has been declared with events, it appears in the Object drop-down list box in the class module, and you can write event procedures for the new object. (When you select the new object in the Object box, the valid events for that object are listed in the Procedure drop-down list box.) Select an event from the Procedure drop-down list box; an empty procedure is added to the class module.

Visual Basic
1
2
3
Private Sub App_DocumentChange()
 
End Sub
Initialize the Declared Object
Before the procedure will run, you must connect the declared object in the class module (App in this example) with the Application object. You can do this with the following code from any module.

Visual Basic
1
2
3
4
Dim X As New EventClassModule
Sub Register_Event_Handler()
    Set X.App = Word.Application
End Sub
Run the Register_Event_Handler procedure. After the procedure is run, the App object in the class module points to the Microsoft Word Application object, and the event procedures in the class module will run when the events occur.
...
3
Заблокирован
16.10.2014, 11:37 5
Это и есть основы объектного программирования
из одного проекта, можно запросто ссылаться на другие (обычно зарегестрированные) библиотеки, общения между ними, это события

Добавлено через 6 минут
P.S, конечно-же свои библиотеки я делаю так.. чтобы они вели себя очень тихо
ничего не просили, не прикапывались, а самое главное чтобы работали ))
0
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
16.10.2014, 12:02 6
Цитата Сообщение от rsuan Посмотреть сообщение
что нужно писать вместо object для текущего документа
Кратко передавая содержимое справочных материалов, процитированных Апостроффом, объясняю: вместо object вам нужно написать имя объекта, поддерживающего событие DocumentBeforeSave (например, имя объекта типа Application) и (внимание!) этот объект должен быть проинициализирован, как в участке
Цитата Сообщение от Апострофф Посмотреть сообщение
Visual Basic
1
2
3
4
Dim X As New EventClassModule
Sub Register_Event_Handler()
 Set X.App = Word.Application
End Sub
Я немного доработал программу из второго поста в данной теме, теперь она представляет собой завершенный проект. Привожу ее код, который необходимо поместить в модуль объекта ThisDocument (ЭтотДокумент).
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
'Объявляем объектную переменную app уровня приложения.
Dim WithEvents app As Application
'При открытии документа инициализируем объектную переменную.
Private Sub Document_Open()
    Set app = Application 'Инициализируем объектную переменную.
End Sub
'Обрабатываем событие, возникающее при попытке сохранения данной книги.
Private Sub app_DocumentBeforeSave(ByVal Doc As Document, ByRef SaveAsUI As Boolean, ByRef Cancel As Boolean)
    If Doc Is ThisDocument Then 'Если документ, сгенерироваший событие - это документ с кодом, то...
        '...выводим запрос на сохранение документа.
        If MsgBox("Вы правда хотите сохранить документ?", vbYesNo) <> vbYes Then _
            Cancel = True 'Если пользователь не ответил утвердительно на запрос, то отменяем сохранение.
    End If
End Sub
'При закрытии документа освобождаем объектную переменную и подавляем автоматический диалог сохранения.
Private Sub Document_Close()
    Set app = Nothing
    If ThisDocument.Saved = False Then 'Если книга не сохранена, то...
        '...выводим запрос на сохранение документа.
        If MsgBox("Вы хотите сохранить документ перед выходом?", vbYesNo) <> vbYes Then
            ThisDocument.Saved = True   'Если пользователь не ответил утвердительно на запрос,
        Else                            'то подавляем автоматический диалог сохранения и выходим.
            ThisDocument.Save           'Если пользователь ответил утвердительно, сохраняем
        End If                          'документ перед выходом.
    End If
End Sub
С уважением,
Аксима
2
4 / 4 / 0
Регистрация: 16.10.2014
Сообщений: 135
16.10.2014, 12:32  [ТС] 7
"Ура! Заработала!"(С) после того как наряду с Dim WithEvents appWord As Word.Application добавил ещё Set appWord = Word.Application . Спасибо всем!
Только вот не пойму, зачем в Ворде так нужно делать, ведь в Экселе обходится без объявления и инициализации.
0
6081 / 1325 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
16.10.2014, 12:55 8
Цитата Сообщение от rsuan Посмотреть сообщение
Только вот не пойму, зачем в Ворде так нужно делать, ведь в Экселе обходится без объявления и инициализации.
Потому что в Excel вы используете объект ThisWorkbook, который уже объявлен, проинициализирован и любезно предоставлен вам приложением (объектом Application). Если бы вам понадобилось использовать события самого объекта Application в Excel, вам пришлось бы повторить в точности ту же процедуру, что приведена здесь для Word.

И это абсолютно логично, ведь если программируете в VBA, то выше объекта Application в иерархии нет никого. Некому командовать объектами Application, объявлять и инициализировать их и предоставлять программисту - это должен делать сам программист.

С уважением,
Аксима
P.S. Для программистов на VSTO есть объект ThisApplication, но это уже тема для отдельного топика...
1
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
18.10.2014, 12:49 9
Для автоматизации работы (в т. ч. и сохранения) также можно использовать процедуру AutoClose: Программное нажатие кнопки "сохранить" в диалоговом окне Word. Почти всю работу выполняет её имя!
0
0 / 0 / 0
Регистрация: 04.04.2019
Сообщений: 3
29.05.2019, 12:53 10
Word 2010 при первом запуске так и не могу отловить Save. Только после событий New, Open, Close появляется возможность BeforeSave. Это как то можно победить? Т.е. получается запустил Word набрал текст - сохранил. И это никак нельзя отследить :-(
0
29.05.2019, 12:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.05.2019, 12:53
Помогаю со студенческими работами здесь

Реализация сохранения документа MS Word
Возникла проблема. Пишу библиотеку, реализующую взаимодействие документов Word с системой...

Как изменить параметры окна сохранения документа в Word 2003?
В окне &quot;Сохранение документа&quot; есть область &quot;Папка&quot;, в которой стандартно присутствуют 5 мест для...

Событие Закрытия Документа Word
Здравствуйте. Задача поставлена такая - открываем из клиента вордовский документ (по шаблону), при...

Событие для сохранения размера колонок stringgrid
Здравствуйте, в какое событие нужно написать функцию сохранение колонок stringgrid ? Размер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru