I have been trying to insert combinations of text and fields in a Word header using the Range object. If I insert the fields manually there is no problem: After the insertion the cursor is behind the field, so further elements can be added.
But if I use VBA, for some fields the cursor remains in from of the field.
The three subroutines below illustrate this problem:
In the first texts and fields are added sequencially, but only the FileName field is positioned properly, the Date, Page and NumPage fields appear in reverse order.
In the second sub I have updated the range object after each insertion of these fields. This works, but is not beautiful and would not work if applied in the middle of a document.
In the third version insertions are made in reverse order. This works fine, but the code is more difficult to comprehend.
So my questions are:
- How can I easily get behind a newly inserted field?
- Why do fields behave different from each other when inserted by code?
Best wishes
Holger Nielsen
Denmark
Sub CreateHeaderForwardsNotOk()
Dim doc As Word.Document, rng As Word.Range
Set doc = ActiveDocument
Set rng = doc.Sections(1).Headers(wdHeaderFooterPrimary).Range
With rng
.Fields.Add Range:=rng, Type:=wdFieldFileName, PreserveFormatting:=True
' .Collapse wdCollapseEnd
.InsertAfter (" ")
.Collapse wdCollapseEnd
.Fields.Add Range:=rng, Type:=wdFieldDate, Text:="\@ YYYY-MM-DD", PreserveFormatting:=True
.Collapse wdCollapseEnd
.InsertAfter (vbTab)
.Collapse wdCollapseEnd
.InsertAfter (":-(")
.Collapse wdCollapseEnd
.InsertAfter (vbTab)
.Collapse wdCollapseEnd
.InsertAfter ("Page ")
.Collapse wdCollapseEnd
.Fields.Add Range:=rng, Type:=wdFieldPage, PreserveFormatting:=True
.Collapse wdCollapseEnd
.InsertAfter (" of ")
.Collapse wdCollapseEnd
.Fields.Add Range:=rng, Type:=wdFieldNumPages, PreserveFormatting:=True
.Collapse wdCollapseEnd
End With
doc.Sections(1).Headers(wdHeaderFooterPrimary).Range.Fields.Update
End Sub
Sub CreateHeaderForwardsOkButAwkward()
Dim doc As Word.Document, rng As Word.Range
Set doc = ActiveDocument
Set rng = doc.Sections(1).Headers(wdHeaderFooterPrimary).Range
With rng
.Fields.Add Range:=rng, Type:=wdFieldFileName, PreserveFormatting:=True
' .Collapse wdCollapseEnd
.InsertAfter (" ")
.Collapse wdCollapseEnd
.Fields.Add Range:=rng, Type:=wdFieldDate, Text:="\@ YYYY-MM-DD", PreserveFormatting:=True
End With
Set rng = doc.Sections(1).Headers(wdHeaderFooterPrimary).Range
With rng
.Collapse wdCollapseEnd
.InsertAfter (vbTab)
.Collapse wdCollapseEnd
.InsertAfter (":-|")
.Collapse wdCollapseEnd
.InsertAfter (vbTab)
.Collapse wdCollapseEnd
.InsertAfter ("Page ")
.Collapse wdCollapseEnd
.Fields.Add Range:=rng, Type:=wdFieldPage, PreserveFormatting:=True
End With
Set rng = doc.Sections(1).Headers(wdHeaderFooterPrimary).Range
With rng
.Collapse wdCollapseEnd
.InsertAfter (" of ")
.Collapse wdCollapseEnd
.Fields.Add Range:=rng, Type:=wdFieldNumPages, PreserveFormatting:=True
End With
Set rng = doc.Sections(1).Headers(wdHeaderFooterPrimary).Range
With rng
.Collapse wdCollapseEnd
End With
doc.Sections(1).Headers(wdHeaderFooterPrimary).Range.Fields.Update
End Sub
Sub CreateHeaderBackwards()
Dim doc As Word.Document, rng As Word.Range
Set doc = ActiveDocument
Set rng = doc.Sections(1).Headers(wdHeaderFooterPrimary).Range
With rng
.Fields.Add Range:=rng, Type:=wdFieldNumPages, PreserveFormatting:=True
.Collapse wdCollapseStart
.InsertBefore (" of ")
.Collapse wdCollapseStart
.Fields.Add Range:=rng, Type:=wdFieldPage, PreserveFormatting:=True
.Collapse wdCollapseStart
.InsertBefore ("Page ")
.Collapse wdCollapseStart
.InsertBefore (vbTab)
.Collapse wdCollapseStart
.InsertBefore (":-)")
.Collapse wdCollapseStart
.InsertBefore (vbTab)
.Collapse wdCollapseStart
.Fields.Add Range:=rng, Type:=wdFieldDate, Text:="\@ YYYY-MM-DD", PreserveFormatting:=True
.Collapse wdCollapseStart
.InsertBefore (" ")
.Collapse wdCollapseStart
.Fields.Add Range:=rng, Type:=wdFieldFileName, PreserveFormatting:=True
.Collapse wdCollapseStart
End With
doc.Sections(1).Headers(wdHeaderFooterPrimary).Range.Fields.Update
End Sub