Word 2016 VBA 循环直到文档结束
Word 2016 VBA loop until end of document
我在网上查看了很多不同的答案,但未能找到适合我的代码的解决方案。这是我第一次在 Word 中编写 VBA(在 Excel 中有一定的经验)。
我认为 this post 可能是我需要的,但它并没有在我的文档末尾停止循环。
我正在尝试在新部分开始之前插入一个连续的分节符,我将其指定为格式为标题 1 的文本。我完全愿意以另一种方式进行此操作,将不胜感激征求您的见解!
Sub InsertSectionBreak()
' Go to start of document
Selection.HomeKey Unit:=wdStory
' Find next section based on header formatting, insert continuous section break just before
'
Selection.Find.ClearFormatting
Selection.Find.Style = ActiveDocument.Styles("Heading 1")
With Selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Do While Selection.Find.Execute = True
Selection.Find.Execute
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.InsertBreak Type:=wdSectionBreakContinuous
Loop
End Sub
问题中的代码还不错,但有一个主要问题:Selection
被移到文档的前面以便插入分节符。这意味着下次 Find
再次运行它会找到相同的标题 1,因此会在同一位置重复插入分节符。
另一个问题是代码正在执行 Find
作为 Do While
标准的一部分(这就是为什么它没有在文档中找到标题 1 的第一个实例)。
以下代码示例使用 Range
objects 而不是 Selection
。您可以将 Range 想象成一个不可见的选择,但有一个非常重要的区别:可以有多个 Ranges;只能选择一个。
建议的代码使用两个范围:一个用于查找,另一个用于插入分节符。查找范围设置为整个文档。查找是否成功存储在一个布尔变量中(bFound
)。
如果查找成功,找到的范围将复制到分节符的范围。 Duplicate
使原始范围成为独立的 "copy",以便它们可以相互独立地进行操作。然后分节符的范围折叠到它的起点(把它想象成按 left-arrow),然后插入分节符。
但是,“查找”范围折叠到其 终点 ,以便将其移到标题 1 格式的文本之外,以便可以定位下一个标题 1。然后再次执行 Find 并重复循环,直到找不到 Heading 1 的更多实例。
Sub InsertSectionBreak()
Dim rngFind As Word.Range, rngSection As Word.Range
Dim bFound As Boolean
Set rngFind = ActiveDocument.content
' Find next section based on header formatting, insert continuous section break just before
'
rngFind.Find.ClearFormatting
rngFind.Find.style = ActiveDocument.styles("Heading 1")
With rngFind.Find
.text = ""
.Replacement.text = ""
.Forward = True
.wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
bFound = .Execute
End With
Do While bFound
Set rngSection = rngFind.Duplicate
rngSection.Collapse wdCollapseStart
rngSection.InsertBreak Type:=wdSectionBreakContinuous
rngFind.Collapse wdCollapseEnd
bFound = rngFind.Find.Execute
Loop
End Sub
如果您感兴趣的内容与某个标题相关,则无需分节符即可获取该标题下的所有内容。例如:
Sub GetHeadingSpanText()
Application.ScreenUpdating = False
Dim Rng As Range
With ActiveDocument.Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = InputBox("What is the text to find?")
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
End With
If .Find.Found = True Then
Set Rng = .Paragraphs(1).Range
Set Rng = Rng.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel")
MsgBox Rng.Text
End If
End With
Set Rng = Nothing
Application.ScreenUpdating = True
End Sub
请注意,此方法获取与最近标题关联的所有内容,无论其级别如何;可以使用更复杂的方法来获取与特定标题级别关联的所有内容,这样,如果在 sub-heading 下找到匹配项,则使用先前的主标题来确定跨越的范围。
我在网上查看了很多不同的答案,但未能找到适合我的代码的解决方案。这是我第一次在 Word 中编写 VBA(在 Excel 中有一定的经验)。
我认为 this post 可能是我需要的,但它并没有在我的文档末尾停止循环。
我正在尝试在新部分开始之前插入一个连续的分节符,我将其指定为格式为标题 1 的文本。我完全愿意以另一种方式进行此操作,将不胜感激征求您的见解!
Sub InsertSectionBreak()
' Go to start of document
Selection.HomeKey Unit:=wdStory
' Find next section based on header formatting, insert continuous section break just before
'
Selection.Find.ClearFormatting
Selection.Find.Style = ActiveDocument.Styles("Heading 1")
With Selection.Find
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Do While Selection.Find.Execute = True
Selection.Find.Execute
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.InsertBreak Type:=wdSectionBreakContinuous
Loop
End Sub
问题中的代码还不错,但有一个主要问题:Selection
被移到文档的前面以便插入分节符。这意味着下次 Find
再次运行它会找到相同的标题 1,因此会在同一位置重复插入分节符。
另一个问题是代码正在执行 Find
作为 Do While
标准的一部分(这就是为什么它没有在文档中找到标题 1 的第一个实例)。
以下代码示例使用 Range
objects 而不是 Selection
。您可以将 Range 想象成一个不可见的选择,但有一个非常重要的区别:可以有多个 Ranges;只能选择一个。
建议的代码使用两个范围:一个用于查找,另一个用于插入分节符。查找范围设置为整个文档。查找是否成功存储在一个布尔变量中(bFound
)。
如果查找成功,找到的范围将复制到分节符的范围。 Duplicate
使原始范围成为独立的 "copy",以便它们可以相互独立地进行操作。然后分节符的范围折叠到它的起点(把它想象成按 left-arrow),然后插入分节符。
但是,“查找”范围折叠到其 终点 ,以便将其移到标题 1 格式的文本之外,以便可以定位下一个标题 1。然后再次执行 Find 并重复循环,直到找不到 Heading 1 的更多实例。
Sub InsertSectionBreak()
Dim rngFind As Word.Range, rngSection As Word.Range
Dim bFound As Boolean
Set rngFind = ActiveDocument.content
' Find next section based on header formatting, insert continuous section break just before
'
rngFind.Find.ClearFormatting
rngFind.Find.style = ActiveDocument.styles("Heading 1")
With rngFind.Find
.text = ""
.Replacement.text = ""
.Forward = True
.wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
bFound = .Execute
End With
Do While bFound
Set rngSection = rngFind.Duplicate
rngSection.Collapse wdCollapseStart
rngSection.InsertBreak Type:=wdSectionBreakContinuous
rngFind.Collapse wdCollapseEnd
bFound = rngFind.Find.Execute
Loop
End Sub
如果您感兴趣的内容与某个标题相关,则无需分节符即可获取该标题下的所有内容。例如:
Sub GetHeadingSpanText()
Application.ScreenUpdating = False
Dim Rng As Range
With ActiveDocument.Range
With .Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = InputBox("What is the text to find?")
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute
End With
If .Find.Found = True Then
Set Rng = .Paragraphs(1).Range
Set Rng = Rng.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel")
MsgBox Rng.Text
End If
End With
Set Rng = Nothing
Application.ScreenUpdating = True
End Sub
请注意,此方法获取与最近标题关联的所有内容,无论其级别如何;可以使用更复杂的方法来获取与特定标题级别关联的所有内容,这样,如果在 sub-heading 下找到匹配项,则使用先前的主标题来确定跨越的范围。