Может ли MergeDocuments работать без сбоев при объединении нескольких больших файлов? - PullRequest
0 голосов
/ 01 февраля 2019

В нашей организации мы отправляем документы для комментариев, а затем объединяем их так, что все комментарии можно сначала просмотреть вместе в одном документе, а затем выборочно принять.Зачастую эти документы достаточно велики (> 1 МБ), и нередко объединяются наборы из 5-10 документов.Часто слияние множества больших документов не удается, то есть первые два документа группы были объединены, но третий и последующие документы отсутствуют в конечном результате.

После некоторых экспериментов мы пришли к«верьте», что проблема заключается в коде, который перебирает набор файлов для объединения.

Private Sub standardMerge(files() As String)
    Dim i As Integer
    Dim file0 As String: file0 = files(0)
    For i = 1 To UBound(files)
        DoEvents
        Word.Documents.Open fileName:=files(i), ReadOnly:=False, addtorecentfiles:=False

        Application.MergeDocuments _
            OriginalDocument:=Documents(files(i)), RevisedDocument:=Documents(file0), _
            Destination:=wdCompareDestinationRevised, _
            Granularity:=wdGranularityCharLevel, _
            CompareFormatting:=True, CompareCaseChanges:=True, CompareWhitespace:=True, _
            CompareTables:=True, CompareHeaders:=True, CompareFootnotes:=True, _
            CompareTextboxes:=True, CompareFields:=True, CompareComments:=True, _
            FormatFrom:=wdMergeFormatFromRevised, CompareMoves:=True

        DoEvents
        snooze 5
        Documents(files(i)).Close False
        DoEvents
    Next i
End Sub

Поскольку документы большие, мы представляем, что Word запускает процессы для выполнения отдельных слияний.Один процесс запускается до того, как предыдущий будет полностью завершен, поэтому последующие слияния завершаются неудачно.

Мы добавили функцию «snooze» для задержки Word между итерациями.Это, кажется, помогло, но это решение действительно просто пинает банку в будущем.Неясно, действительно ли это проблема или действительно решение.Функция откладывания - это обычный вызов Windows API.

Public Sub snooze(arg As Long)
    Dim i As Long
    Dim a As Long: a = arg * 1000
    Word.Application.StatusBar = "Snooze for " & arg & " seconds"
    For i = 0 To a / 250
        Sleep 250
    Next i
End Sub

Является ли это хотя бы правдоподобным объяснением проблемы сбоя при слиянии без вывода сообщений?

Есть ли лучшее решение этой проблемы, котороене полагается на слепое торможение в задержке?

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