Есть разные способы сделать это; в основном это вопрос личных предпочтений, какой подход используется. Вот два. Один использует поиск по шаблону с заменой; другой манипулирует объектами Range
. Первое, вероятно, выполняется быстрее (хотя это не было бы заметно в этом контексте) и оставляет только один «след» в списке отмен Word.
Примечание: я предпочитаю работать с Range
, а не Selection
. Первый вариант можно сделать с помощью Selection
; второй лучше с Range
.
- Выполняет ли поиск по шаблону знак абзаца плюс кавычку Обратите внимание, что каждый термин находится в скобках: они позволяют работать с термином в Замене - в скобках определяется выражений .
Это позволяет изменить информацию как замену: кавычка предшествует метке абзаца - метка абзаца остается неизменной (маркеры не теряются).
Sub TestFindParaAndQuote()
Dim rngFind As Word.Range
Set rngFind = ActiveDocument.content
rngFind.Find.ClearFormatting
With rngFind.Find
.Text = "(^13)(" & ChrW(8220) & ")"
.Replacement.Text = "\2\1"
.Forward = True
.wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = True
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceOne
End With
End Sub
- Если
Find.Execute
успешен, Range
(или Selection
) перемещается к найденному члену. Здесь, если bFound = True
, то: 1) кавычка вставляется перед Range
; 2) Range
свернуто до конечной точки (после оригинальной цитаты); 3) затем продлен назад, чтобы включить эту цитату; 4) и весь Range
удален. (Следующая строка, которая закомментирована, может быть включена, если также следует удалить абзац после оригинальной цитаты.)
Этот пример полезен для понимания того, как работать с Find
, когда стандартный Find / Replace по какой-то причине не может выполнить работу.
Sub TestFindParaAndQuote()
Dim rngFind As Word.Range
Dim bFound As Boolean
Set rngFind = ActiveDocument.content
rngFind.Find.ClearFormatting
With rngFind.Find
.Text = "^p" & ChrW(8220)
.Forward = True
.wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
bFound = .Execute
If bFound Then
rngFind.InsertBefore ChrW(8220)
rngFind.Collapse wdCollapseEnd
rngFind.MoveStart wdCharacter, -1
'rngFind.MoveEnd wdCharacter, 1 'use this, too, if the paragraph mark should be removed
'rngFind.Select 'for testing purposes
rngFind.Delete
End If
End With
End Sub