Код в вопросе не плохой, но имеет серьезную проблему: Selection
перемещается по направлению к передней части документа, чтобы вставить разрыв раздела.Это означает, что в следующий раз, когда Find
запускается, он снова находит тот же заголовок 1 и, таким образом, многократно вставляет разрывы разделов в том же месте.
Другая проблема заключается в том, что код выполняет Find
как часть Do While
критерий (именно поэтому он не находит первый экземпляр заголовка 1 в документе).
Следующий пример кода работает с Range
объектами вместо Selection
.Вы можете думать о диапазоне как о невидимом выделении с очень важным отличием: может быть несколько диапазонов;выбор может быть только один.
В предлагаемом коде используются два диапазона: один для поиска, а другой для вставки разрыва раздела.Диапазон поиска устанавливается для всего документа.Успешность поиска сохраняется в логической переменной (bFound
).
Если поиск успешен, найденный диапазон дублируется до диапазона для разрыва раздела.Duplicate
делает независимую «копию» исходного диапазона, чтобы им можно было управлять независимо друг от друга.Затем диапазон разрыва раздела сворачивается до его начальной точки (воспринимается как нажатие стрелки влево), затем вставляется разрыв раздела.
Однако диапазон поиска сворачивается до значения конечная точка , чтобы переместить ее за пределы текста, отформатированного в заголовке 1, чтобы можно было выбрать следующий заголовок 1.Затем поиск выполняется снова, и цикл повторяется до тех пор, пока не будет найдено больше экземпляров заголовка 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