Поиск блока текста с различным форматированием в документе Word с помощью макросов - PullRequest
1 голос
/ 16 февраля 2011

Я работаю над созданием макроса в Microsoft Word (2007) для документа, содержащего текст, такой как:

(1) Жирный заголовок. Обычный текст.

С этим текстом я хотел бы выполнить ряд преобразований для первой части - (1) Жирный заголовок. - этого текста.

При этом «(1)» и «Жирный заголовок». имеют согласованный стиль (полужирный и Arial), пробел между двумя не имеет (это Times New Roman, не жирный).

Я думал, что поиск ниже будет работать, без каких-либо ограничений формата.

"^13(\([0-9]@\)) (?@)."

К сожалению, есть также случаи, когда текст выглядит следующим образом:

(1) Обычный текст.

Для таких блоков я хочу полностью пропустить текст.

К сожалению, мой шаблонный поиск также найдет эти экземпляры, если я не смогу ограничить их стилями шрифтов.

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

.Text = "^13(\([0-9]@\)) (?@)."
.Font.Name = "Arial"
.Font.Size = 9
.Font.Bold = True

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

Есть ли способ найти текст с различным форматированием в макросе Word?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

Интересно, подойдет ли что-то подобное:

Dim s As Range
Dim wd As Range
Dim BoldHead As Boolean
Dim doc As Document

Set doc = Word.Documents("Doc2.doc")

For Each s In doc.Sentences
    If s.Words(1).Bold = True Then
        BoldHead = True
        For Each wd In s.Words
            If Trim(wd) <> vbNullString _
                And wd <> "." _
                And wd.Bold = False Then
                BoldHead = False
            End If
        Next
        If BoldHead Then
            Debug.Print s
        End If
    End If
Next

Обратите внимание, что Word имеет довольно неприятную привычку не считать числа, он видит их автоматически.

1 голос
/ 22 февраля 2011

Ответ Рему - именно то, что мне было нужно, но поскольку StackOverflow - отличный ресурс, я решил настроить его для нашего конкретного случая:

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

(Некоторые из приведенных ниже комментариев были включены во внешние ресурсы, которые я нашел, поэтому вопрос о том, действительно ли они необходимы, сомнителен, но ... это работает.)

' Do our bold heading replacements
Dim s As Range, p As Paragraph
Dim wd As Range
Dim BoldHead As Boolean
Dim doc As Document

Set doc = ActiveDocument

For Each p In doc.Paragraphs
    Set s = p.Range.Sentences(1)
    If s.Words(1).Bold = True And s.Words(1).Characters(1) = "(" Then
        BoldHead = True
        For Each wd In s.Words
            If Trim(wd) <> vbNullString _
                And wd <> "." _
                And wd.Bold = False Then
                BoldHead = False
            End If
        Next
        If BoldHead Then
            With s.Find
                ' Clear all previously set formatting for Find dialog box.
                .ClearFormatting
                .Text = "(\([0-9]@\)) (?@)."

                ' Clear all previously set formatting for Replace dialog box.
                .Replacement.ClearFormatting
                .Replacement.Text = "\1 \2."
                .Replacement.Font.SmallCaps = True
                .Replacement.Font.Name = "Times New Roman"
                .Replacement.Font.Bold = False

                ' The following parameters must be set as follows to find only text formatted for the specified font.
                .Forward = True
                .Wrap = wdFindContinue
                .Format = True
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = True
                .MatchSoundsLike = False
                .MatchAllWordForms = False

                .Execute Replace:=wdReplaceOne
            End With

            With s.Find
                ' Clear all previously set formatting for Find dialog box.
                .ClearFormatting
                .Text = "(\([0-9]@\)) "

                ' Clear all previously set formatting for Replace dialog box.
                .Replacement.ClearFormatting
                .Replacement.Text = "\1" & vbTab
                .Replacement.Font.SmallCaps = False
                .Replacement.Font.Name = "Arial"
                .Replacement.Font.Bold = True

                ' The following parameters must be set as follows to find only text formatted for the specified font.
                .Forward = True
                .Wrap = wdFindContinue
                .Format = True
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = True
                .MatchSoundsLike = False
                .MatchAllWordForms = False

                .Execute Replace:=wdReplaceOne
            End With
        End If
    End If
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...