我正在为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宏中查找具有不同格式的文本?
谢谢!
答案 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