合并信中的VBA表

时间:2018-06-27 16:51:49

标签: vba excel-vba word-vba mailmerge docx-mailmerge

我有一个包含大量客户数据的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”)。Cells(k,j)

            Next j
        End If
    Next k
Next i

现在我的问题:

  1. 如何在占位符“ insert_table_here”之后将这些数据插入到新创建的表中?

  2. 如何确保邮件合并系列中的每个字母在此表中仅包含该字母所要包含的客户数据?

    要找到解决方案,我已经考虑过是否可能有一个提供当前“邮件合并编号”的功能。在那种情况下,我可以将字段(MailMergeNumber,1)与(k,1)进行比较,以仅显示包含当前客户的结果。

示例,使其更易于理解:

A先生,

...

A先生购买的物品表

-文档结尾-

B先生,

...

B先生购买的物品表

-文档结尾-

依此类推...

2 个答案:

答案 0 :(得分:1)

如果要从模板创建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

答案 1 :(得分:1)

您可以为此使用Word的目录/目录邮件合并功能(术语取决于Word版本)。要查看如何使用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字段和宏来驱动该过程。可以在以下位置找到该方法的概述:

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字段,而无需需要一个宏。可以在以下位置找到此方法的概述:

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的道格·罗宾斯(Doug Robbins)