Vba Word邮件合并记录计数返回-1

Vba Word邮件合并记录计数返回-1,vba,datasource,ms-word,mailmerge,Vba,Datasource,Ms Word,Mailmerge,我正在尝试查找word邮件合并文档的数据源 我要在邮件合并数据源中运行的代码如下所示: ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord lastDoc = ActiveDocument.MailMerge.DataSource.RecordCount 现在一切都很顺利。我运行数据源并执行我需要执行的操作 现在,由于其他原因,我为其制作此文件的用户正在使用小助手功能:Mail Merge helper(它存在于Wo

我正在尝试查找word邮件合并文档的数据源

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

ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord
lastDoc = ActiveDocument.MailMerge.DataSource.RecordCount
现在一切都很顺利。我运行数据源并执行我需要执行的操作

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

但是,当他们使用此选项时,my ActiveDocument.MailMerge.DataSource.RecordCount返回-1。这意味着它不能决定数据源中记录的数量。我的假设是邮件合并助手没有正确设置数据源

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


怎么了?除了迭代合并,是否还有其他方法可以让我逐个获取记录?

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

我并不完全清楚您需要做什么,但在某些情况下,您可以通过设置

theDoc.MailMerge.DataSource.ActiveRecord
到大于记录计数的任何数字。我想你能做的就是

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

Sub-MailMergeOneThingPerDataSourceRecord()
暗色长的线绳
将objMerge设置为Word.MailMerge
Dim bError为布尔型
Dim B终端显示为布尔值
设置objMerge=ActiveDocument.MailMerge
错误
bTerminateMerge=False
带着objMerge
lngSourceRecord=1
直到B终端出现
出错时继续下一步
.DataSource.ActiveRecord=lngSourceRecord
如果Err.Number=0,则
错误转到0
如果.DataSource.ActiveRecord

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

谢谢你,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
Dim count As Integer

ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord
count = ActiveDocument.MailMerge.DataSource.ActiveRecord
ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord