Обновление из обсуждения в комментариях к другому ответу. Описанная ниже проблема относится к Word 2016 и более ранним версиям. Начиная с Office 365 (и, возможно, Word 2019, но это не подтверждено), поведение Replace
было изменено для «преобразования» ANSI 13 в «реальный» знак абзаца,поэтому проблема в вопросе не возникнет.
Ответ
Причиной нечетного поведения при форматировании является использование Chr(11)
, которое вставляет новую строку (Shift + Enter) вместо нового абзаца. Таким образом, стиль абзаца, примененный к любой части этого текста, форматирует весь текст с тем же стилем.
В этом конкретном случае (работа с Replace
), vbCr
или эквивалентный Chr(13)
также не делают 'не работает, потому что это не настоящий абзац Word. Абзац - это нечто большее, чем просто код 13 ANSI - он содержит информацию о форматировании абзаца. Таким образом, пока код выполняется, Word на самом деле не распознает их как настоящие метки абзаца, и назначение стиля абзаца применяется ко «всему».
Что работает, так это использование строки ^p
, котораяв Word Find / Replace это «псевдоним» для полного знака абзаца. Так, например:
replace_stuff "<PLACEHOLDER>", section_names(i) & "^p" & "<PLACEHOLDER>", wdStyleHeading2
replace_stuff "<PLACEHOLDER>", section_bodies(i) & "^p" & "<PLACEHOLDER>", wdStyleNormal
Однако существует более эффективный способ создания документа, чем вставка заполнителя для каждого нового элемента и использование Find / Replace для замены заполнителя содержимым документа. Более традиционный подход - работать с Range
объектом (думать о нем, как о невидимом выделении) ...
Назначить содержимое для Range
, отформатировать его, свернуть (как нажатие стрелки вправо длявыбор) и повторить. Вот пример, который возвращает тот же результат, что и (исправленный) код в вопросе:
Sub main()
Dim rng As Range
Set rng = ActiveDocument.content
Dim section_names(2) As String
section_names(0) = "Introduction"
section_names(1) = "Background"
section_names(2) = "Conclusion"
Dim section_bodies(2) As String
section_bodies(0) = "This is the body text for the introduction! Fetched from some file."
section_bodies(1) = "And Background... I have no issue fetching data from the files."
section_bodies(2) = "And for the conclusion... But I want the styles to 'stick'!"
Dim i As Integer
For i = 0 To 2
BuildParagraph section_names(i), wdStyleHeading2, rng
BuildParagraph section_bodies(i), wdStyleNormal, rng
Next i
End Sub
Sub BuildParagraph(para_text As String, para_style As Long, rng As Range)
rng.Text = para_text
rng.style = para_style
rng.InsertParagraphAfter
rng.Collapse wdCollapseEnd
End Sub