0

我有一个包含大量客户数据的 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先生购买的物品表

-文件结束-

等等...

4

2 回答 2

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
于 2018-06-27T19:50:18.457 回答
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 文档之前,请务必阅读本教程。

根据您要实现的目标,为此的字段编码可能很复杂。但是,由于教程文档包含所有示例的工作域代码,大部分艰苦的工作已经为您完成 - 您应该能够做的只是将相关域代码复制/粘贴到您自己的邮件合并主文档中,替换/插入您自己的字段名称并调整格式以获得您想要的结果。对于一些工作示例,请参阅以下帖子的附件:

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;或者

Doug Robbins 在https://onedrive.live.com/?cid=5AEDCB43615E886B&id=5AEDCB43615E886B!566

于 2018-06-28T04:52:53.820 回答