johanrex
johanrex

Reputation: 419

Creating multiple Word paragraphs with Document.Paragraphs.Add()

I'm using a macro in Excel to add information to a Word document. I'm trying to add 10 lines to an existing Word document like this:

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

I have an empty Word document at C:\temp\document.docs but after running the code there is only one line with the text "Paragraph 10". I was expecting 10 lines.

As far as I can tell the Paragraphs.Add() with no arguments should create a new paragraph. Perhaps I'm mistaken to believe that a new paragraph produces a new line? Is there another way to add 10 lines in a loop where each can have a specific (not the same) style?

Upvotes: 1

Views: 9586

Answers (4)

Dietrich Baumgarten
Dietrich Baumgarten

Reputation: 714

The Paragraphs.Add method appends a new paragraph consisting of the paragraph mark only at the end of the document. Oddly enough, the return value is not the now last paragraph but the penultimate paragraph. You get a reference to the new last paragraph by the Next method of the paragraph object. You can then set the style and insert text with the paragraph.Range.InsertBefore method.

The critical part of your code must be like this

'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

Upvotes: 1

BGraniela
BGraniela

Reputation: 11

I had a similar problem. Adding doc.Range.InsertParagraphAfter fixed my problems. The following code should work for you:

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

Upvotes: 1

Joel Spolsky
Joel Spolsky

Reputation: 33667

The "paragraph" that you are adding does not have a paragraph mark at the end.

Change that line to

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

and that should fix your problem.

Upvotes: 3

Cindy Meister
Cindy Meister

Reputation: 25673

Actually, what's happening in the original code is that you're always replacing the content when you use

Doc.Paragraphs.Add

So there's only ever the one paragraph. There are various ways to get around this. One is to use InsertAfter, as has been mentioned in comments. (Note that if you're going to use this, the correct way to specify a new paragraph as part of a string is vbCr or Chr(13). Word can very easily misinterpret anything else!)

My personal preference is to work with a Range object that can be manipulated independently of the entire document. For example, it can be done like this:

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

Upvotes: 3

Related Questions