Word Mail Merge记录计数返回-1

时间:2016-06-20 11:56:53

标签: vba ms-word datasource word-vba mailmerge

我正在尝试浏览单词邮件合并文档的数据源。

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

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

现在一切都很顺利。我浏览数据源并做我需要做的事情。

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

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

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

有什么问题?有没有替代迭代合并,所以我可以逐个获取记录?

2 个答案:

答案 0 :(得分:6)

谢谢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

答案 1 :(得分:1)

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

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

theDoc.MailMerge.DataSource.ActiveRecord

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

theDoc.MailMerge.DataSource.ActiveRecord = 2147483647# 

然而,我并不完全确定即使这样就足够了。首先,如果数据源是一个多用户数据库,那么在合并期间记录计数可能会发生变化是不可想象的,因此在开始时设置.l​​astrecord可能实际上不起作用(尽管在大多数情况下我会想到这一点) ,您实际上将检索和处理事务中的记录,在这种情况下,您可能一直看到相同的记录集。您可以通过尝试在每次迭代中递增.ActiveRecord来处理这种可能性。如果已到达记录的末尾,.ActiveRecord将不会递增。在Windows Word上,您可能还必须处理用户可以通过“编辑收件人列表”对话框排除单个记录的可能性。在这种情况下,当您尝试增加.ActiveRecord时,它实际上会跳到下一个Included / Selected记录(如果有的话),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中如何准确地检测每次合并中消耗了多少记录并不明显。