Таблица VBA в объединенном письме - PullRequest
0 голосов
/ 27 июня 2018

У меня есть лист Excel с большим количеством данных клиента. Все клиенты имеют общие данные (адрес, имя и т. Д.), Которые я реализовал как простые поля слияния У некоторых клиентов есть несколько наборов данных, которые должны быть добавлены в виде таблицы в конце объединенного письма. Чтобы найти данные из моего листа Excel, я уже придумал следующий код. noInt - это количество клиентов, а noData - это количество различных наборов данных (все клиенты вместе, некоторые кратны). exWb - это книга Excel, из которой получены мои данные, и данные, которые я хочу отобразить в таблице, располагаются в столбцах с 5 по 9.

For i = 2 To noInt

    For k = 2 To noData

        If exWb.Sheets("Table1").Cells(k, 1) = exWb.Sheets("Table2").Cells(i, 1) Then
            For j = 5 To 9

Вставить в таблицу exWb.Sheets ("Таблица1"). Ячейки (k, j)

            Next j
        End If
    Next k
Next i

Теперь мои вопросы:

  1. Как вставить эти данные во вновь созданную таблицу после заполнителя "insert_table_here"?

  2. Как я могу убедиться, что для каждого письма в серии почтовых рассылок есть только данные о клиенте, о котором идет речь, в эту таблицу?

    Чтобы найти решение этой проблемы, я уже думал о том, существует ли, возможно, функция, которая выдает текущий «номер слияния». В этом случае я мог бы сравнить поле (MailMergeNumber, 1) с (k, 1), чтобы показать только результаты, которые включают текущего клиента.

Пример, чтобы сделать его более понятным:

Уважаемый мистер А,

...

Таблица предметов, которые Мистер А купил

-Конец документа-

Уважаемый мистер Б,

...

Таблица предметов, которые мистер Б купил

-Конец документа-

И так далее ...

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Для этого вы можете использовать средство Word / Directory Mailmerge для Word (терминология зависит от версии Word). Чтобы узнать, как это сделать с любым источником данных mailmerge, поддерживаемым Word, ознакомьтесь с моим Учебным пособием по каталогу / каталогу Microsoft Word по адресу:

http://www.msofficeforums.com/mail-merge/38721-microsoft-word-catalogue-directory-mailmerge-tutorial.html

или

http://www.gmayor.com/Zips/Catalogue%20Mailmerge.zip

Учебное пособие охватывает все: от создания списка до вставки и вычисления значений в таблицах с несколькими записями в виде букв. Прочтите руководство, прежде чем пытаться использовать прилагаемый к нему документ mailmerge.

В зависимости от того, чего вы пытаетесь достичь, кодирование поля для этого может быть сложным. Тем не менее, поскольку учебный документ включает в себя рабочие коды полей для всех своих примеров, большая часть тяжелой работы для вас уже проделана - вы сможете сделать чуть больше, чем просто скопировать / вставить соответствующие коды полей в свой основной документ mailmerge. , замените / вставьте свои собственные имена полей и настройте форматирование, чтобы получить желаемые результаты. Некоторые примеры работ см. В приложениях к сообщениям по адресу:

http://www.msofficeforums.com/mail-merge/9180-mail-merge-duplicate-names-but-different-dollar.html#post23345

http://www.msofficeforums.com/mail-merge/11436-access-word-creating-list-multiple-records.html#post30327

Другой вариант - использовать поле DATABASE в основном документе «letter» mailmerge и макрос для управления процессом. Краткое описание этого подхода можно найти по адресу:

http://answers.microsoft.com/en-us/office/forum/office_2010-word/many-to-one-email-merge-using-tables/8bce1798-fbe8-41f9-a121-1996c14dca5d

И наоборот, если вы используете реляционную базу данных или книгу Excel с отдельной таблицей, содержащей только один экземпляр каждого из критериев группировки, поле DATABASE в обычном основном документе mailmerge «письмо» может использоваться без нужен макрос. Краткое описание этого подхода можно найти по адресу:

https://answers.microsoft.com/en-us/msoffice/forum/msoffice_word-mso_winother-mso_2010/mail-merge-to-a-word-table-on-a-single-page/4edb4654-27e0-47d2-bd5f-8642e46fa103

Рабочий пример см .:

http://www.msofficeforums.com/mail-merge/37844-mail-merge-using-one-excel-file-multiple.html

В качестве альтернативы вы можете попробовать одну из надстроек слияния «многие к одному» из:

Мэр Грэма в http://www.gmayor.com/ManyToOne.htm; или

Дуг Роббинс в https://onedrive.live.com/?cid=5AEDCB43615E886B&id=5AEDCB43615E886B!566

0 голосов
/ 27 июня 2018

Если вы создаете документы Word из шаблона (это, как правило, самый простой способ сделать это), вы можете добавить таблицу в шаблон документа с нужными вам строками заголовка и 1 пустой строкой для данные. Затем, после заполнения базовых полей слияния, вы можете перебирать текущие поля клиента, добавляя новые строки в таблицу Word по мере продвижения. Примерно так:

Dim exWs as Excel.Worksheet
Dim CurrentCustomerFirstCell as Excel.Range
Dim CurrentCustomerActiveCell as Excel.Range
Dim EmpRowOffset as integer
Dim wdDoc as Word.Document
Dim wdTable as Word.Table, wdCell as Word.Cell

' set up your existing references, including (I assume) to the Word document you're updating

set exWs = exWb.Sheets("Table1")

' initialize row for current employee
CurrentCustomerFirstCell = exWs.Cells(2,1)

do while CurrentCustomerFirstCell.Row <= noData ' consider renaming noData to somthing like "numberOfRows"
    ' populate basic mergefields
    wdDoc.Fields(1).Result.Text = CurrentCustomerFirstCell.Value
    ' etc.

    ' populate table in Word document
    set wdTable = wdDoc.Tables(1)

    EmpRowOffset = 0
    set CurrentCustomerActiveCell = CurrentCustomerFirstCell.Offset(Rowoffset:=EmpRowOffset)

    set wdTable = wdDoc.Tables(1)

    do while CurrentCustomerActiveCell.Value = CurrentCustomerFirstCell.Value
        ' this code would update the first "data" row in the existing Word table
        ' to the 6th column of the active employee row
        set wdCell = wdTable.Cell(Row:=2 + EmpRowOffset, Column:=1)
        wdCell.Range.Text = _
                CurrentCustomerActiveCell.Offset(columnoffset:=5).Value
        wdTable.Rows.Add

        EmpRowOffset = EmpRowOffset + 1
        set CurrentCustomerActiveCell = CurrentCustomerFirstCell.Offset(RowOffset:=EmpRowOffset)
    Loop

    ' now that we're finished processing the employee, update CurrentCustomerFirstCell
    set CurrentCustomerFirstCell = CurrentCustomerActiveCell
loop
...