-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMailMergeExHandler.cls
120 lines (97 loc) · 3.13 KB
/
MailMergeExHandler.cls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "MailMergeExHandler"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
Public Doc As Document
Dim Tag_StartOfDocument As String
Dim Tag_FieldStart As String
Dim Tag_FieldEnd As String
Dim Tag_FieldNameDelimiter As String
Sub Class_Initialize()
Tag_StartOfDocument = MailMergeEx.Tag_StartOfDocument
Tag_FieldStart = MailMergeEx.Tag_FieldStart
Tag_FieldEnd = MailMergeEx.Tag_FieldEnd
Tag_FieldNameDelimiter = MailMergeEx.Tag_FieldNameDelimiter
End Sub
Sub InstallTags()
AddStartOfDocumentTag
Dim f As field
For Each f In Doc.Fields
AddFieldTags f
Next
End Sub
Sub RemoveTags()
RemoveStartOfDocumentTag
Dim f As field
For Each f In Doc.Fields
RemoveFieldTags f
Next
End Sub
Sub AddFieldTags(f As field)
Dim fieldCommand As String
fieldCommand = Trim(f.Code.Text)
If f.Type = wdFieldMergeField And fieldCommand Like "MERGEFIELD *" Then
Dim Name As String
Dim r As Range
Name = Trim(Split(fieldCommand, " ", 2)(1))
Set r = FieldRange(f)
' insert text in reverse order
r.InsertBefore Tag_FieldNameDelimiter
r.InsertBefore Name
r.InsertBefore Tag_FieldStart
r.InsertAfter Tag_FieldEnd
End If
End Sub
Sub RemoveFieldTags(f As field)
Dim fieldCommand As String
fieldCommand = Trim(f.Code.Text)
If f.Type = wdFieldMergeField And fieldCommand Like "MERGEFIELD *" Then
Dim Name As String
Dim r As Range
Name = Trim(Split(fieldCommand, " ", 2)(1))
Set r = FieldRange(f)
' remove text in reverse order
SafeRemoveBefore r, Tag_FieldNameDelimiter
SafeRemoveBefore r, Name
SafeRemoveBefore r, Tag_FieldStart
SafeRemoveAfter r, Tag_FieldEnd
End If
End Sub
Sub AddStartOfDocumentTag()
StartOfDocumentRange.InsertAfter Tag_StartOfDocument
End Sub
Sub RemoveStartOfDocumentTag()
SafeRemoveAfter StartOfDocumentRange, Tag_StartOfDocument
End Sub
' -----------------------------------
' SafeRemove means remove that checks that the text to remove does
' exist before removing it.
Sub SafeRemoveBefore(location As Range, str)
Dim r As Range
Set r = Doc.Range(location.Start - Len(str), location.Start)
SafeRemoveAt r, str
End Sub
Sub SafeRemoveAfter(location As Range, str)
Dim r As Range
Set r = Doc.Range(location.End, location.End + Len(str))
SafeRemoveAt r, str
End Sub
Sub SafeRemoveAt(location As Range, str)
If location.Text <> str Then
MsgBox location.Text & " not found as " & location.Start
Else
location.Delete
End If
End Sub
Function StartOfDocumentRange() As Range
Set StartOfDocumentRange = Doc.Range(Doc.Range.Start, Doc.Range.Start)
End Function
Function FieldRange(f As field) As Range
Set FieldRange = Doc.Range(f.Code.Start - 1, f.Result.End + 1)
End Function