Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 |

 

  Вопрос: Как ограничить количество открытых документов Word Добавлено: 26.07.08 16:33  

Автор вопроса:  NightWishMaster
Как на языке VBA сделать так, чтобы в данном экземпляре Ворда не могло быть открыто более одного документа? Т.е. чтобы при открытии или создании нового документа Ворд сначала предлагал закрыть уже открытый документ (если такой существует). Мне необходим «однодокументный» режим работы Ворд, такой, например, как у WordPad.
Я так понимаю, что мне нужно отлавливать событие перед открытием документа, только вот как?

Ответить

  Ответы Всего ответов: 18  

Номер ответа: 1
Автор ответа:
 NightWishMaster



Вопросов: 3
Ответов: 11
 Профиль | | #1 Добавлено: 26.07.08 16:33
Если знаете, как это сделать не на VBA, то меня это думаю тоже устроит :)

Ответить

Номер ответа: 2
Автор ответа:
 J. Smith



ICQ: ненавижу 

Вопросов: 40
Ответов: 477
 Web-сайт: Не хочу ломать голову, если её уже сломал кто-то другой.
 Профиль | | #2
Добавлено: 26.07.08 17:01
посмотри что MsgBox Documents.Count покажет

Ответить

Номер ответа: 3
Автор ответа:
 NightWishMaster



Вопросов: 3
Ответов: 11
 Профиль | | #3 Добавлено: 26.07.08 17:10
Documents.Count показывает количество открытых документов. Но как я его могу использовать? Если я задаю события объекта Application NewDocument или DocumentOpen, то они срабатывают уже ПОСЛЕ открытия документа (в этом случае Documents.Count будет равняться 2). Если я в этих событиях попробую закрыть предыдущий документ, он окажется не сохраненным и пользователь в запросе на сохранение нажмет "Отмена", то открытыми останется два документа, а я останусь при своих интересах :) Аналогично с соответствующими событиями объекта Document. Я хотел бы закрывать открытый документ ДО ТОГО, как откроется новый. Только вот как? :-/

Ответить

Номер ответа: 4
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #4
Добавлено: 26.07.08 17:33
____ Я думаю, что надо в первую очередь макрос "забить" в normal.dot, потому как он пристёгивается автоматом. Может быть настроить его расположение в параметрах Word.
____ При создании нового документа Вам ничего не мешает проверить существование уже открытого и только что созданный закрыть без сохранения и выдать сообщение о необходимости закрыть существующий.
____ То есть, событие надо обрабатывать в normal.dot.

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 26.07.08 18:19
____ Я думаю, что надо в первую очередь макрос "забить" в normal.dot, потому как он пристёгивается автоматом. Может быть настроить его расположение в параметрах Word.
____ При создании нового документа Вам ничего не мешает проверить существование уже открытого и только что созданный закрыть без сохранения и выдать сообщение о необходимости закрыть существующий.
____ То есть, событие надо обрабатывать в normal.dot.


Начинается, я думал уже не увижу этих черточек

Ответить

Номер ответа: 6
Автор ответа:
 NightWishMaster



Вопросов: 3
Ответов: 11
 Профиль | | #6 Добавлено: 26.07.08 18:26
ADSemenov, спасибо!
Сделал так:

Private Sub Document_New()
    
    On Error GoTo errorHandler
    
    If Documents.Count > 1 Then
        ActiveDocument.Close
        ActiveDocument.Close SaveChanges:=wdPromptToSaveChanges
        If Documents.Count = 0 Then
            Word.Documents.Add
        End If
    End If
    
errorHandler:

End Sub

Private Sub Document_Open()
    
    On Error GoTo errorHandler
    
    If Documents.Count > 1 Then
        Dim OpenedFileName As String
        OpenedFileName = ActiveDocument.FullName
        ActiveDocument.Close
        ActiveDocument.Close SaveChanges:=wdPromptToSaveChanges
        If Documents.Count = 0 Then
            Word.Documents.Open FileName:=OpenedFileName
        End If
    End If
    
errorHandler:
    
End Sub


В принципе нормально, единственный минус - это "бликанье" открываемого-закрываемого документа. Как думаете, с этим как-нить можно бороться?

И еще одно. Если я открываю не документ, а другой шаблон (не Нормал.дот), или документ на основе другого шаблона, то мои события, понятно, не происходят и второй документ преспокойно открывается. Как бороться с этим? Запретить открывать документы на основе других шаблонов?

Ответить

Номер ответа: 7
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #7
Добавлено: 26.07.08 18:29
Ужас :(

Ответить

Номер ответа: 8
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #8
Добавлено: 26.07.08 18:33
    То есть, Normal.dot не отрабатывает? Если не отрабатывает, то сделать, по моему, ничего нельзя.
    В Excel есть возможность с этим бороться, пристегнув надстройку, которая будет всегда загружаться с любым документом.

Ответить

Номер ответа: 9
Автор ответа:
 NightWishMaster



Вопросов: 3
Ответов: 11
 Профиль | | #9 Добавлено: 26.07.08 18:38
Да нет, если я просто открываю любой документ, то все норм. События Normal.dot не срабатывают, если я открываю не документ, а другой шаблон, либо же создаю документ на основе другого шаблона (клацаю дважды на шалбон из проводника).

Ответить

Номер ответа: 10
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #10
Добавлено: 26.07.08 19:24
    Надо чтобы все шаблоны были созданы на основе normal.dot. Тогда, по-видимому, будет пристёгиватьсЯ и normal.dot во всех случаях. Попробуйте создать шаблон на основе normal.dot и создать документ на его основе.

Ответить

Номер ответа: 11
Автор ответа:
 NightWishMaster



Вопросов: 3
Ответов: 11
 Профиль | | #11 Добавлено: 26.07.08 19:52
Чтобы события срабатывали и при открытии шаблонов, отличных от Normal.dot, я заменил эти события на аналогичные события объекта Application - DocumentOpen и NewDocument. Теперь работает и при открытии других шаблонов =)

Ответить

Номер ответа: 12
Автор ответа:
 NightWishMaster



Вопросов: 3
Ответов: 11
 Профиль | | #12 Добавлено: 26.07.08 19:54
И все же - неужели никак нельзя отловить какое-нибудь событие ДО открытия документа? Все таки открытие-закрытие документа не очень приятно бликает =\ Хотя вобщем можна сказать, что задача решена.

Ответить

Номер ответа: 13
Автор ответа:
 NightWishMaster



Вопросов: 3
Ответов: 11
 Профиль | | #13 Добавлено: 26.07.08 20:06
А как програмно поменять основной шаблон? Например, я хочу, чтобы базовым шаблоном был не Normal.dot, а Doc.dot.

Ответить

Номер ответа: 14
Автор ответа:
 NightWishMaster



Вопросов: 3
Ответов: 11
 Профиль | | #14 Добавлено: 26.07.08 20:21
Объясню вкратце, зачем это мне - я создаю экземпляр Word програмно и хочу, чтобы в созданном экземпляре основной шаблон (Normal.dot) был другой, нежели в экземплярах Word, запущеных пользователем. Мне нужно, чтобы мой Ворд был однодокументным, в то время как Ворд, запущеный пользователем, продолжал работать как и раньше со многими документами одновременно.

Ответить

Номер ответа: 15
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #15
Добавлено: 26.07.08 20:27
    Может быть надо сначала создать свой шаблон (любым способом), а потом создать программно документ на его основе?

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам