如何使用 Word MailMerge 在 VBA 中的 If..else 语句中插入合并域? [英] How do I insert a mergefield into an If..else statement in VBA using Word MailMerge?
问题描述
下面的宏将输入字段标题,然后是字段值.If 语句应该检查字段的值,如果它大于 30,则给出实际值,否则为零.
The below macro will input the field heading followed by the field value. The If statement should check the value of the field and if its greater than 30 the actual value is given, otherwise a zero.
如果它是真的,我只得到我输入的实际文本,而不是它的值.
Instead of the value appearing if it's true, I just get the actual text I've typed, not it's value.
Sub Macro1()
Dim doc As Word.Document
Dim dtField As Word.MailMergeDataField
Dim sFieldName As String
Dim sFieldActualName As String
Dim j As Integer
Set doc = ActiveDocument
j = 1
For Each dtField In doc.MailMerge.DataSource.DataFields
sFieldActualName = doc.MailMerge.DataSource.FieldNames(j).Name
sFieldName = dtField.Name
Selection.TypeText Text:=sFieldActualName + ": "
'---------------------------------------------------------------------------
doc.MailMerge.Fields.AddIf Range:=Selection.Range, MergeField:= _
sFieldName, Comparison:=wdMergeIfGreaterThan,_
CompareTo:="30", TrueText:="{MERGEFIELD sFieldName}", _
FalseText:="0"
'---------------------------------------------------------------------------
Selection.TypeParagraph
j = j + 1
Next
End Sub
如果我需要澄清任何事情,请告诉我.
Please let me know if i need to clarify anything.
我使用的来自 excel 的示例数据
Sample data I'm using from excel
one two three four five
85 50 63 50 41
52 10 84 10 15
85 25 63 35 10
推荐答案
据我所知,插入嵌套字段集的唯一方法是直接插入字段.嵌套字段很棘手 - 在互联网上有几种外面"的方法.以下是我使用的.
As far as I know, the only way to insert a nested field set is to insert the fields directly. Nested fields are tricky - there are a couple of approaches "out there", in the internet. The following is the one I use.
在此变体中,最外面的字段插入了内部字段代码的占位符文本.占位符文本是带有键入括号的字段代码(不是 Ctrl+F9 类型).
In this variation, the outer-most field is inserted with placeholder text for the inner field code(s). The placeholder text is the field code with typed brackets (not the Ctrl+F9 kind).
外部字段与占位符字符串一起发送到函数 GenerateNestedField
.该函数在字段代码中定位占位符并在其位置插入实际字段.
The outer field is sent to the Function GenerateNestedField
along with the placeholder string. The function locates the placeholder in the field's code and inserts the real field in its place.
我不得不修改我的标准代码以处理您为 If 字段插入 MailMergeField 的事实.有必要将 MailMergeField 转换为常规 Word.Field,我通过选择插入的字段,然后获取 Fields 集合中的第一个字段来完成.
I had to modify my standard code to work with the fact that you're inserting a MailMergeField for the If field. It's necessary to convert the MailMergeField to a regular Word.Field which I do by selecting the inserted field, then taking the first Field in the Fields collection.
Sub IfPlusMergeField()
Dim doc As word.Document
Dim sFieldCode As String, sFieldName As String
Dim fldMerge As word.MailMergeField
Dim fldIf As word.Field
Set doc = ActiveDocument
sFieldName = dt.FieldName
sFieldCode = "{Mergefield " & sFieldName & "}"
Set fldMerge = doc.MailMerge.Fields.AddIf(Range:=Selection.Range, _
MERGEFIELD:=sFieldName, Comparison:=wdMergeIfGreaterThan, _
CompareTo:="30", TrueText:=sFieldCode, _
FalseText:="0")
fldMerge.Select
Set fldIf = Selection.Fields(1)
Debug.Print GenerateNestedField(fldIf, sFieldCode)
End Sub
'Returns the changed field code
Function GenerateNestedField(fldOuter As word.Field, _
sPlaceholder As String) As String
Dim rngFld As word.Range, doc As word.Document
Dim bFound As Boolean
Dim sFieldCode As String
Set doc = fldOuter.Parent
Set rngFld = fldOuter.code
rngFld.TextRetrievalMode.IncludeFieldCodes = True
bFound = rngFld.Find.Execute(findText:=sPlaceholder)
'Get the field code from the placeholder by removing the { }
sFieldCode = Mid(sPlaceholder, 2, Len(sPlaceholder) - 2)
If bFound Then
doc.Fields.Add rngFld, word.WdFieldType.wdFieldEmpty, sFieldCode, False
End If
'Debug.Print fldOuter.code
GenerateNestedField = fldOuter.code
End Function
这篇关于如何使用 Word MailMerge 在 VBA 中的 If..else 语句中插入合并域?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!