使用宏在Word文档中查找具有不同格式的文本块

时间:2011-02-16 20:04:18

标签: vba ms-word

我正在为Microsoft Word(2007)中的宏创建一个包含以下文本的文档:

  

(1)粗体标题。普通文字。

在本文中,我想对第一部分进行一些转换 - (1)粗体标题。 - 该文本。

而“(1)”和“大胆的标题”。具有一致的风格(粗体和Arial),之间的空间两者之间没有(它是Times New Roman,非粗体)。

我认为搜索下面的内容会有效,没有任何格式限制。

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

不幸的是,还有一些文字如下:

  

(1)普通文字。

对于这样的块,我想完全跳过文本。

不幸的是,我的通配符搜索也会找到这些实例,除非我可以通过字体样式限制它。

如果我可以在第一种情况下规范化空间,那么我可以在我的通配符搜索中添加字体限制以获取正确的内容。

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

但是,我需要能够在搜索中抓取两个不同格式的项目以规范化该空间,从我对VBA的有限知识来看,这似乎是不可能的。

有没有办法在Word宏中查找具有不同格式的文本?

谢谢!

2 个答案:

答案 0 :(得分:4)

我想知道这样的事情是否合适:

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 :(得分:1)

Remou的回答正是我所需要的,但是由于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