【问题标题】:Word Mail Merge recordcount returns -1Word 邮件合并记录计数返回 -1
【发布时间】:2016-06-20 11:56:53
【问题描述】:

我正在尝试为 word 邮件合并文档检查数据源。

我通过邮件合并数据源运行的代码如下所示:

ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord
lastDoc = ActiveDocument.MailMerge.DataSource.RecordCount

现在一切运行良好。我遍历数据源并做我需要做的事情。

现在,由于其他原因,我正在为其制作此功能的用户正在使用小助手功能:Mail Merger Helper(它存在于 Word 2010 中)

但是,当他们使用它时,我的 ActiveDocument.MailMerge.DataSource.RecordCount 返回 -1。这意味着它无法决定数据源中的记录数。我的假设是 Mail Merger Helper 没有正确设置数据源。

但这阻止了我迭代邮件合并(当他使用助手时,他仍然可以激活通常的邮件合并功能,例如查看合并的结果)。

怎么了?是否有替代迭代合并的替代方法,以便我可以一一获取记录?

【问题讨论】:

    标签: vba datasource ms-word mailmerge


    【解决方案1】:

    谢谢bibadia,你带领我走上正轨。

    当您将 ActiveRecord 设置为 wdLastRecord 时。您可以从 ActiveRecord 中读取最后一个数据源。所以我只需要抓住它,然后再次将 ActiveRecord 设置为 wdFirstRecord。

    Dim count As Integer
    
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord
    count = ActiveDocument.MailMerge.DataSource.ActiveRecord
    ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord
    

    【讨论】:

      【解决方案2】:

      不幸的是,对于某些数据源,Word 确实将 RecordCount 设置为 -1。在某些情况下,这可能是 Word 使用 ADO/OLE DB 连接的结果,因为例如,当您使用 ADO 检索 RecordSet 时,有时必须使用 .MoveLast 来检索实际记录数,甚至这取决于ADO 光标类型和其他 ADO 设置。但是,即使是与 Excel Word 的 DDE 连接也可以返回 -1 记录数。

      我并不完全清楚你需要能够做什么,但在某些情况下你可以通过设置来建立当前最大的记录数

      theDoc.MailMerge.DataSource.ActiveRecord
      

      到任何大于记录数的数字。我怀疑你能做的最好的就是

      theDoc.MailMerge.DataSource.ActiveRecord = 2147483647# 
      

      但是,我不完全确定即使这样就足够了。一方面,如果数据源是多用户数据库,在合并过程中记录数可能发生变化并非不可想象,因此在开头设置 .lastrecord 可能实际上不起作用(尽管我会认为在大多数情况下,您实际上将检索和处理事务中的记录,在这种情况下,您可能会一直看到同一组记录)。您可以通过尝试在每次迭代中增加 .ActiveRecord 来处理这种可能性。如果您已到达记录的末尾,.ActiveRecord 将不会增加。在 Windows Word 上,您可能还必须处理用户可以通过“编辑收件人列表”对话框排除单个记录的可能性。在这种情况下,当您尝试增加 .ActiveRecord 时,它实际上会跳到下一个包含/选定的记录(如果有)并且 Word 也可能会引发错误。因此,以下内容显示了您如何能够针对我在 Windows Word 上所知道的所有可能性进行编码。 (不过,此特定版本未经过测试):

      Sub MailMergeOneThingPerDataSourceRecord()
      Dim lngSourceRecord As Long
      Dim objMerge As Word.MailMerge
      Dim bError As Boolean
      Dim bTerminateMerge As Boolean
      Set objMerge = ActiveDocument.MailMerge
      bError = False
      bTerminateMerge = False
      With objMerge
        lngSourceRecord = 1
        Do Until bTerminateMerge
          On Error Resume Next
          .DataSource.ActiveRecord = lngSourceRecord
          If Err.Number = 0 Then
            On Error GoTo 0
            If .DataSource.ActiveRecord < lngSourceRecord Then
              bTerminateMerge = True
            Else
              lngSourceRecord = .DataSource.ActiveRecord
              .DataSource.FirstRecord = lngSourceRecord
              .DataSource.LastRecord = lngSourceRecord
              .Destination = wdSendToNewDocument
              .Execute
              lngSourceRecord = lngSourceRecord + 1
            End If
          Else
            bTerminateMerge = True
            If Err.Number <> 5853 Then
              bError = True
            End If
          End If
        Loop
      End With
      If bError Then
        ' deal with the error (you may prefer to do your error
        ' handling some other way) but e.g....
        MsgBox "Error " & Err.Number & ": " & Err.Description
      End If
      Set objMerge = Nothing
      End Sub
      

      但是,只有当您知道邮件合并主文档一次只使用 1 个数据源记录时,这才真正有效。如果其中有 { NEXT } 等字段,则每次迭代可能会消耗多条记录。如果您知道有多少,您可以尝试跳过相关数量的记录。如果数字可以变化(例如,通过 { NEXTIF } 语句,那么您如何在 VBA 中准确检测每次合并中消耗了多少记录并不明显。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多