Word 邮件合并记录数 returns -1
Word Mail Merge recordcount returns -1
我正在尝试通过一个 word 邮件合并文档的数据源。
我通过邮件合并数据源 运行 的代码如下所示:
ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord
lastDoc = ActiveDocument.MailMerge.DataSource.RecordCount
现在一切正常。我运行通过数据源,做我需要做的。
现在我做这个的用户由于其他原因正在使用小助手功能:邮件合并助手(它存在于 Word 2010 中)
然而,当他们使用它时,我的 ActiveDocument.MailMerge.DataSource.RecordCount returns -1。这意味着它无法决定数据源中的记录数。我的假设是邮件合并助手没有正确设置数据源。
但这让我无法迭代邮件合并(当他使用助手时,他仍然可以激活通常的邮件合并功能,例如查看合并结果)。
怎么了?是否有迭代合并的替代方法,以便我可以一条一条地获取记录?
遗憾的是,对于某些数据源,Word 确实将 RecordCount 设置为 -1。在某些情况下,这可能是 Word 使用 ADO/OLE 数据库连接的结果,因为例如,当您使用 ADO 检索 RecordSet 时,有时必须使用 .MoveLast 来检索实际记录数,甚至取决于 ADO 游标类型和其他 ADO 设置。但是,即使是与 Excel 的 DDE 连接,Word 也可以 return -1 记录数。
我不是很清楚你到底需要做什么,但在某些情况下你可以通过设置
来建立当前最大的记录数
theDoc.MailMerge.DataSource.ActiveRecord
大于记录数的任意数字。我怀疑你能做的最好的是
theDoc.MailMerge.DataSource.ActiveRecord = 2147483647#
但是,我不确定这是否足够。一方面,如果数据源是多用户数据库,记录数在合并过程中可能会发生变化并不是不可想象的,因此在开头设置 .lastrecord 可能实际上不起作用(尽管我认为在大多数情况下,您实际上是在检索和处理事务中的记录,在这种情况下,您可能会一直看到同一组记录)。您可以通过尝试在每次迭代中增加 .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 中准确检测每次合并中消耗了多少记录并不明显。
谢谢 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
我正在尝试通过一个 word 邮件合并文档的数据源。
我通过邮件合并数据源 运行 的代码如下所示:
ActiveDocument.MailMerge.DataSource.ActiveRecord = wdFirstRecord
lastDoc = ActiveDocument.MailMerge.DataSource.RecordCount
现在一切正常。我运行通过数据源,做我需要做的。
现在我做这个的用户由于其他原因正在使用小助手功能:邮件合并助手(它存在于 Word 2010 中)
然而,当他们使用它时,我的 ActiveDocument.MailMerge.DataSource.RecordCount returns -1。这意味着它无法决定数据源中的记录数。我的假设是邮件合并助手没有正确设置数据源。
但这让我无法迭代邮件合并(当他使用助手时,他仍然可以激活通常的邮件合并功能,例如查看合并结果)。
怎么了?是否有迭代合并的替代方法,以便我可以一条一条地获取记录?
遗憾的是,对于某些数据源,Word 确实将 RecordCount 设置为 -1。在某些情况下,这可能是 Word 使用 ADO/OLE 数据库连接的结果,因为例如,当您使用 ADO 检索 RecordSet 时,有时必须使用 .MoveLast 来检索实际记录数,甚至取决于 ADO 游标类型和其他 ADO 设置。但是,即使是与 Excel 的 DDE 连接,Word 也可以 return -1 记录数。
我不是很清楚你到底需要做什么,但在某些情况下你可以通过设置
来建立当前最大的记录数theDoc.MailMerge.DataSource.ActiveRecord
大于记录数的任意数字。我怀疑你能做的最好的是
theDoc.MailMerge.DataSource.ActiveRecord = 2147483647#
但是,我不确定这是否足够。一方面,如果数据源是多用户数据库,记录数在合并过程中可能会发生变化并不是不可想象的,因此在开头设置 .lastrecord 可能实际上不起作用(尽管我认为在大多数情况下,您实际上是在检索和处理事务中的记录,在这种情况下,您可能会一直看到同一组记录)。您可以通过尝试在每次迭代中增加 .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 中准确检测每次合并中消耗了多少记录并不明显。
谢谢 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