Как вставить поле слияния в оператор If..else в VBA с помощью Word MailMerge?

Приведенный ниже макрос вводит заголовок поля, за которым следует значение поля. Оператор If должен проверять значение поля, и если оно больше 30, дается фактическое значение, в противном случае - ноль.

Вместо того, чтобы отображать значение, если оно истинно, я просто получаю фактический текст, который я набрал, а не его значение.

   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

Пожалуйста, дайте мне знать, если мне нужно что-то уточнить.

Изменить: образцы данных, которые я использую из Excel

one   two   three   four    five
85    50     63      50      41
52    10     84      10      15
85    25     63      35      10

person WillacyMe    schedule 12.04.2018    source источник
comment
Я не понимаю, что вы подразумеваете под фактическим текстом, который я напечатал. Набрали где / когда?   -  person Cindy Meister    schedule 12.04.2018
comment
Извините, где я поместил TrueText: = {MERGEFIELD sFieldName} внутри оператора if, текстовый документ просто напечатает {MERGEFIELD sFieldName}, а не 85 или любое другое значение, которое должно иметь поле.   -  person WillacyMe    schedule 12.04.2018


Ответы (1)


Насколько мне известно, единственный способ вставить вложенный набор полей - это вставить поля напрямую. Вложенные поля сложны - есть несколько подходов "там", в Интернете. Вот тот, который я использую.

В этом варианте самое внешнее поле вставляется с текстом-заполнителем для кода (ов) внутреннего поля. Текст-заполнитель - это код поля с набранными скобками (не типа Ctrl + F9).

Внешнее поле отправляется в функцию GenerateNestedField вместе со строкой заполнителя. Функция находит местозаполнитель в коде поля и вставляет на его место реальное поле.

Мне пришлось изменить свой стандартный код, чтобы он работал с тем фактом, что вы вставляете MailMergeField для поля If. Необходимо преобразовать MailMergeField в обычный Word.Field, что я делаю, выбирая вставленное поле, а затем выбирая первое поле в коллекции полей.

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
person Cindy Meister    schedule 12.04.2018
comment
Для демонстрации того, как напрямую вставлять вложенные поля, см: social.msdn.microsoft.com/Forums / vstudio / en-US / - person macropod; 16.04.2018