【问题标题】:VBA Table in Merged Letter合并字母中的 VBA 表
【发布时间】:2018-06-27 16:51:49
【问题描述】:

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

-文档结束-

等等……

【问题讨论】:

  • 桌子长什么样?它的尺寸会变化吗?
  • 它有固定的 5 列,但行会因每个客户购买的商品数量而异。

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


【解决方案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

【讨论】:

    【解决方案2】:

    您可以为此使用 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 工作簿,其中包含一个单独的表,其中每个分组条件只有一个实例,则可以在没有需要一个宏。可以在以下位置找到此方法的概要:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多