Таблица 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
Теперь мои вопросы:
Как я могу вставить эти данные во вновь созданную таблицу после заполнителя "insert_table_here"?
Как я могу убедиться, что для каждого письма в серии почтовых слияний есть только данные о клиенте, о котором идет речь, в эту таблицу?
Чтобы найти решение этой проблемы, я уже думал о том, существует ли функция, которая выдает текущий "номер слияния". В этом случае я мог бы сравнить поле (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.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 и макроса для управления процессом. Краткое описание этого подхода можно найти по адресу:
И наоборот, если вы используете реляционную базу данных или книгу Excel с отдельной таблицей, содержащей только один экземпляр каждого из критериев группировки, поле DATABASE в обычном главном документе mailmerge "письмо" может использоваться без необходимости макро. Краткое описание этого подхода можно найти по адресу:
Рабочий пример см.:
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