Проблема размещения в регулярных выражениях более 700 матчей в длинном документе - PullRequest
0 голосов
/ 03 марта 2019

Мне нужно изменить более 700 библиографических ссылок, чтобы поместить их в сноски в документе из сотен страниц.Итак, я смотрю на VBA Word, но я почти новичок.Кажется, трудно найти документацию, особенно в отношении основы (объектная модель и т. Д.).Вот то, что я попробовал, и основная проблема, с которой я столкнулся, описана после.Эскиз используемого кода выглядит следующим образом:

Sub Replace_ref_1()
' Definition of all variables'

Set docRange = ActiveDocument.Range

' Definition of the Regex needed  '
With regEx
   ... 
End With

Options.Overtype = False ' Insert and not delete '
ActiveDocument.TrackRevisions = False ' Out of tracking changes mode '
' Regex matchs '
Set regFound = regEx.Execute(docRange)

' Loop over results, going by the last (highest index) '
For cpt = regFound.Count To 1 Step -1
    refText = regFound(cpt - 1)
    Selection.SetRange Start:=regFound.Item(cpt - 1).FirstIndex, End:=regFound.Item(cpt - 1).FirstIndex
    Selection.Collapse Direction:=wdCollapseStart
    Selection.Footnotes.Add Range:=Selection.Range, Text:=LTrim(refText)
Next cpt

End Sub

Идея состоит в том, чтобы использовать индекс каждого совпадения (который, если я правильно понимаю, номер начального символа совпадающей строки)вставить сноску в этом месте.Я сталкиваюсь со следующей проблемой: номера (отметки) сносок не вставлены в правильном месте.В общем, от нескольких до нескольких десятков персонажей раньше ожидаемых.Я думал, что это связано с тем, что добавление сносок подразумевает добавление символов в текст, и поэтому индекс не может быть в порядке.Вот почему я пытался обрабатывать от последнего к первому: ср."вниз" цикл.(Я проверял перед этой попыткой, чтобы совпадения находились в возрастающем индексе, записав их в файл.) Но это не лучше ...

Я также заметил, что для части текста, содержащей только 3 совпадения, все в порядке,Но как только текст становится слишком длинным, он не работает ни с первым, ни с последним совпадением.Я также заметил, что было бы лучше, если бы я удалил резюме (которое находится в начале), но даже с этим «трюком» для части документа с 133 совпадениями, только 57 первых в порядке, а все последующие сдвинуты(без какого-либо изменения формата между 57-м и 58-м соответствием ...).

Я думаю, что может быть проблема в моем понимании индекса или, более того, в части текста, включенной в индексы...

Я был бы рад, если бы кто-нибудь мог помочь мне в этом.

Спасибо.

РЕДАКТИРОВАТЬ : ссылки на 3 документа

1) input.doc (запись) -> http://dl.free.fr/jlfRDviRe

2) output.doc (как он должен выглядеть в конце) -> http://dl.free.fr/hNu2IAUMp

3) полученный.doc (что получить с помощью приведенного выше кода) -> http://dl.free.fr/b5OF5PKCL

Примечание: документы, полученные из документа, найденного в Интернете, и измененные ...

РЕДАКТИРОВАТЬ2 (19-03-07): новый документ, представляющий собой весь документ, который я использовал, с тем же форматом (анонимный текст), тем же стилем и т. Д. Обратите внимание, что 5-й первыйГаптеры (до стр. 31) показывают желаемый результат.Таким образом, макрос найдет только совпадения, начиная со страницы 32 ...

4) -> http://dl.free.fr/fGzSid05k

1 Ответ

0 голосов
/ 04 марта 2019

Попробуйте этот код.

Смотрите комментарии в коде, чтобы вы имели представление о том, что происходит

Option Explicit

Sub ProcessFootnotes()

    Dim wordRange As Word.Range

    Dim startText As String
    Dim endText As String
    Dim footnoteText As String
    Dim footnoteCounter As Long

    On Error GoTo Err_Handler

    Application.ScreenUpdating = False

    ' To begin searching the whole document again
    Set wordRange = ActiveDocument.Content

    ' You have to escape the characters with "\" otherwise they are invalid
    startText = "\(\["
    endText = "\]\)"

    ' Initialize the footnote counter
    footnoteCounter = 1

    ' Clear formatting to be sure there's nothing saved in the settings before
    wordRange.Find.ClearFormatting
    wordRange.Find.Replacement.ClearFormatting

    With wordRange.Find
        ' This will look for text contained between start and end text
        .Text = startText & "*" & endText
        .Replacement.Text = ""
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = True
        .MatchSoundsLike = False
        .MatchAllWordForms = False

        wordRange.Find.Execute

        ' Loop to find in the whole document
        While wordRange.Find.Found

            ' Maintain word alive
            DoEvents

            ' Remove both parenthesis
            footnoteText = Replace(Replace(wordRange.Text, "(", ""), ")", "")

            ' Insert the footnote
            ActiveDocument.Footnotes.Add wordRange, , footnoteText

            ' Remove the original text
            wordRange.Text = ""

            ' Increase the footnote counter
            footnoteCounter = footnoteCounter + 1

            ' Search the next one
            wordRange.Find.Execute
        Wend

    End With

Sub_Exit:
    Application.ScreenUpdating = True
    Exit Sub

Err_Handler:
    MsgBox "Error: " & Err.Description
    GoTo Sub_Exit


End Sub

Дайте мне знать, если это работает (я проверил это с вашим вкладомфайл), и если это так, не забудьте пометить ответ.

...