Таблица VBA в объединенном письме

У меня есть лист 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("Table1"). Ячейки (k, j)

            Next j
        End If
    Next k
Next i

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

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

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

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

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

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

...

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

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

Уважаемый г-н Б,

...

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

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

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

2 ответа

Решение

Если вы создаете документы 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

Для этого вы можете использовать Word каталог / каталог Mailmerge (терминология зависит от версии 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

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

Другим вариантом будет использование поля 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

Другие вопросы по тегам