I wanted a function in Word VBA that would add a Field to a Range’s Fields collection and automatically extend the Range to include the added field.
This mimics the behavior of the Range.InsertAfter function and similar functions.
It allows you to keep adding text, fields, and other items to a Word document sequentially.
The function I created is called InsertFieldAfter. Its parameters mimic the parameters to the Fields.Add function.
The Range you pass in is extended to include the newly added Field. The new Range is also returned as the function return value for convenience.
The text of the function and related support functions is below, followed by an example of how to use the function.
' Expand the Range to include the added field and return it. Public Function InsertFieldAfter( _ ByRef Range As Word.Range, _ ByVal FieldType As WdFieldType, _ ByVal Text As String, _ Optional ByVal PreserveFormatting As Boolean = False _ ) As Word.Range On Error GoTo handler Dim StartPos As Long, EndPos As Long StartPos = Range.Start Range.Collapse Direction:=wdCollapseEnd EndPos = Range.Fields.Add( _ Range:=Range, _ Type:=FieldType, _ Text:=Text, _ PreserveFormatting:=PreserveFormatting) _ .Result.End + 1 Range.SetRange StartPos, EndPos Set InsertFieldAfter = Range Exit Function handler: ' handle any run-time error here End Function
Here’s a code snippet showing an example of its use:
With myRange .InsertAfter "Here is a field: " InsertFieldAfter Range:=myRange, FieldType:=wdFieldEmpty, Text:="REF Field1" .InsertAfter vbCrLf & "Here is another field: " InsertFieldAfter Range:=myRange, FieldType:=wdFieldEmpty, Text:="REF Field2" .InsertAfter vbCrLf End With
Happy coding!
David,
One more big “thank you” from another coder out here in the cold; your work is appreciated, as is your generosity in putting it where we can find and use it.
Hi Devid,
Thanks you so much for this code. Hats off to you… indeed it helped a lot to my problem as I was struggling since few hours.