Как исправить: ThisDocument.Close зависает MS Word - PullRequest
0 голосов
/ 01 февраля 2019

Почему следующий код, запущенный из MS Word (основной документ MailMerge), останавливает приложение на ThisDocument.Close False?

Нужно ли закрывать Scripting.Dictionary каким-либо образом, кроме установки объекта на nothing?

Существует только один активный экземпляр Word, он виден, ThisDocumentне является активным документом.Я даже явно активирую последний открытый документ, даже если он уже активен.Не уверен, что мне даже нужно установить oWorkbook и oExcel на nothing.

Sub MailMergeAlternative()

    Dim oExcel As Object
    Dim oWorkbook As Object
    Dim oFirstCell As Object   
    Set oExcel = CreateObject("Excel.Application")
    Set oWorkbook = oExcel.workbooks.Open(SOUBOR)
    Set oFirstCell = oWorkbook.sheets(SESIT).Cells(1, 1) 

    Dim Dict As Object
    Set Dict = MakeDictionary() ' Scripting.dictionary

    Dim oDoc As Object
    Dim Radek As Long
    Dim Radku As Long
    Radku = oFirstCell.currentregion.Rows.Count    

    For Radek = 2 To Radku
        ' ... fill Dict, use MailMerge to create new document for active record ...
        Set oDoc = ActiveDocument ' the new document after MailMerge
        ' ... insert values, save the new document, do not close it ...
    Next

Closing:
    oDoc.Activate           '  <== set to active, not needed
    Set Dict = Nothing
    oWorkbook.Close
    oExcel.Quit
    Set oWorkbook = Nothing ' probably not needed, closed above
    Set oExcel = Nothing    ' probably not needed, closed above

    ThisDocument.Close False ' <== Problem

End Sub

Ожидается: Код запускается, создает новый документ (ы) и закрываетсядокумент, который содержит макрос и откуда он был вызван.Последний активный документ остается открытым (только что созданный), или, если ничего не было создано, приложение Word закрывается.

Что происходит: Документ закрывается, последний активный документ остается открытым.Но Word зависает, и документ нужно найти в диспетчере задач и «вывести на передний план».Это не проблема при использовании только MailMerge (с дополнительной работой vba), и похоже, что он связан с использованием Excel и Scripting.Dictionary.

1 Ответ

0 голосов
/ 01 февраля 2019

Поскольку вы не предоставляете [mcve], чтобы мы могли точно проверить, что вы делаете, возможно, что следующее решение не будет работать для вашей конкретной среды.Мой тест был выполнен по приведенному ниже коду, который по сути создает ряд новых документов, а затем закрывает документ.(У меня нет доступа к вашему содержимому Excel или к MakeDictionary())

Я создал шаблон (dotm) и вставил в него код, закрыл его, создал новый документ из шаблона.Этот документ имеет доступ к коду через ссылку на шаблон.Закрытие документа также приведет к освобождению шаблона (если не открыт другой документ на его основе).Но в моем тесте код завершился без ошибки.

Sub TestCloseSelfDocument()
    Dim docMmMainMerge As Word.Document

    Set docMmMainMerge = ActiveDocument
    Dim Dict As Object

    Dim oDoc As Object
    Dim Radek As Long
    Dim Radku As Long
    Radku = 5

    For Radek = 2 To Radku
        Documents.Add
        ' ... fill Dict, use MailMerge to create new document for active record ...
        Set oDoc = ActiveDocument ' the new document after MailMerge
        ' ... insert values, save the new document, do not close it ...
    Next

Closing:
    Set Dict = Nothing

    docMmMainMerge.Close False     
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...