Создание нескольких абзацев Word с помощью Document.Paragraphs.Add () - PullRequest
0 голосов
/ 01 мая 2018

Я использую макрос в Excel, чтобы добавить информацию в документ Word. Я пытаюсь добавить 10 строк в существующий документ Word следующим образом:

Sub AddParagraphs()

    'Open Word
    Dim wordApp As Word.Application
    Set wordApp = CreateObject("Word.Application")

    'Open
    Dim doc As Word.document
    Set doc = wordApp.Documents.Open("c:\temp\document.docx")

    'Add 10 paragraphs
    Dim idx As Integer
    For idx = 1 To 10

        Dim paragraph As Word.paragraph
        Set paragraph = doc.Paragraphs.Add()

        paragraph.Range.style = wdStyleHeading2
        paragraph.Range.text = "Paragraph " & CStr(idx)

    Next

    doc.Save

    doc.Close
    wordApp.Quit

End Sub

У меня есть пустой документ Word в C: \ temp \ document.docs, но после выполнения кода остается только одна строка с текстом «Параграф 10». Я ожидал 10 строк.

Насколько я могу сказать, Paragraphs.Add () без аргументов должен создать новый абзац. Возможно, я ошибаюсь, полагая, что новый параграф производит новую строку? Есть ли другой способ добавить 10 строк в цикл, где каждая из них может иметь определенный (не одинаковый) стиль?

Ответы [ 4 ]

0 голосов
/ 29 апреля 2019

Метод Paragraphs.Add добавляет новый абзац, состоящий из метки абзаца, только в конце документа. Как ни странно, возвращаемое значение - это не последний, а теперь предпоследний абзац. Вы получаете ссылку на новый последний абзац методом Next объекта абзаца. Затем вы можете установить стиль и вставить текст с помощью метода paragraph.Range.InsertBefore.

Критическая часть вашего кода должна быть такой

'Add 10 paragraphs
 Dim idx As Integer
 Dim paragraph As word.paragraph
 For idx = 1 To 10
   Set paragraph = doc.Paragraphs.Add.Next
   paragraph.Range.style = word.WdBuiltinStyle.wdStyleHeading2
   paragraph.Range.InsertBefore "Paragraph " & CStr(idx)
 Next
0 голосов
/ 01 мая 2018

На самом деле в исходном коде происходит то, что вы всегда заменяете контент, когда используете

Doc.Paragraphs.Add

Так что есть только один параграф. Есть разные способы обойти это. Одним из них является использование InsertAfter, как уже упоминалось в комментариях. (Обратите внимание, что если вы собираетесь использовать это, правильный способ указать новый абзац как часть строки - vbCr или Chr (13). Word может очень легко неверно истолковать что-либо еще!)

Мое личное предпочтение - работать с Range объектом, которым можно манипулировать независимо от всего документа. Например, это можно сделать так:

Sub AddParagraphs()

    'Open Word
    Dim wordApp As Word.Application
    Set wordApp = CreateObject("Word.Application")

    'Open
    Dim doc As Word.document
    Set doc = wordApp.Documents.Open("c:\temp\document.docx")
    Dim rng as Word.Range
    Set rng = doc.Content

    'Add 10 paragraphs
    Dim idx As Integer
    For idx = 1 To 10

        Dim paragraph As Word.paragraph
        'So that the next thing inserted follows instead of replaces
        rng.Collapse wdCollapseEnd           
        Set paragraph = rng.Paragraphs.Add

        paragraph.Range.style = wdStyleHeading2
        paragraph.Range.text = "Paragraph " & CStr(idx)
     Next

    doc.Save

    doc.Close
    wordApp.Quit

End Sub
0 голосов
/ 05 апреля 2019

У меня была похожая проблема. Добавление doc.Range.InsertParagraphAfter исправило мои проблемы. Следующий код должен работать для вас:

Sub AddParagraphs()

    'Open Word
    Dim wordApp As Word.Application
    Set wordApp = CreateObject("Word.Application")

    'Open
    Dim doc As Word.document
    Set doc = wordApp.Documents.Open("c:\temp\document.docx")

    'Add 10 paragraphs
    Dim idx As Integer
    For idx = 1 To 10

        Dim paragraph As Word.paragraph
        Set paragraph = doc.Paragraphs.Add()

        paragraph.Range.style = wdStyleHeading2
        paragraph.Range.text = "Paragraph " 

        doc.Range.InsertParagraphAfter

    Next

    doc.Save

    doc.Close
    wordApp.Quit

End Sub
0 голосов
/ 01 мая 2018

Добавляемый вами «абзац» не имеет знака абзаца в конце.

Измените эту строку на

paragraph.Range.Text = "Paragraph " & CStr(idx) & vbCr

и это должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...