【发布时间】:2010-10-11 11:00:47
【问题描述】:
我正在开发一个 Access 数据库,该数据库会生成一些邮件,这些邮件是从 Access 数据库中的 VBA 代码调用的邮件合并。问题是,如果我打开一个新的 Word 文档并启动邮件合并 (VBA),Word 会打开同一个 Access 数据库(已经打开)来获取数据。有什么办法可以防止这种情况发生吗?以便使用已经打开的数据库实例?
经过一些测试,我得到一个奇怪的行为:如果我打开 Access 数据库持有 SHIFT 键邮件合并不会打开同一数据库的其他 Access 实例。如果我在不持有密钥的情况下打开 Access 数据库,则会得到所描述的行为。
我的邮件合并 VBA 代码:
On Error GoTo ErrorHandler
Dim word As word.Application
Dim Form As word.Document
Set word = CreateObject("Word.Application")
Set Form = word.Documents.Open("tpl.doc")
With word
word.Visible = True
With .ActiveDocument.MailMerge
.MainDocumentType = wdMailingLabels
.OpenDataSource Name:= CurrentProject.FullName, ConfirmConversions:=False, _
ReadOnly:=False, LinkToSource:=False, AddToRecentFiles:=False, _
PasswordDocument:="", PasswordTemplate:="", WritePasswordDocument:="", _
WritePasswordTemplate:="", Revert:=False, Format:=wdOpenFormatAuto, _
SQLStatement:="[MY QUERY]", _
SQLStatement1:="", _
SubType:=wdMergeSubTypeWord2000, OpenExclusive:=False
.Destination = wdSendToNewDocument
.Execute
.MainDocumentType = wdNotAMergeDocument
End With
End With
Form.Close False
Set Form = Nothing
Set word = Nothing
Exit_Error:
Exit Sub
ErrorHandler:
word.Quit (False)
Set word = Nothing
' ...
End Sub
整个事情都是用 Access / Word 2003 完成的。
更新 #1 如果有人能告诉我使用或不使用 SHIFT 键打开 Access 之间的确切区别,这也会有所帮助。如果可以编写一些 VBA 代码来启用“功能”,那么如果在没有 SHIFT 键的情况下打开数据库,它至少会“模拟”它。
干杯, 格雷戈尔
【问题讨论】:
-
在按住 Shift 键的同时打开 Access 可防止自动执行宏和其他自动启动的事情发生。请注意,您可以禁用这种可能性。谷歌“AllowBypassKey”。
-
我不想禁用它,我更喜欢需要它...这真的很奇怪:按住 Shift 键,一切正常。不持有它,Word 将在每次新的 Access 实例时打开,并从那里打开 Access 数据库...
-
您有一个 .OpenDataSource 命令但没有 .Close,可以吗? (我对vba这个词不熟悉)。否则,我认为db再打开一次也没问题,只要你事后关掉就行了。
-
看起来没问题。没有任何 Close 方法。向 Word 模板添加一些代码的问题是,它还可能关闭用户自己打开的 Access 实例。因此,据我所知,无法确定何时关闭/不关闭数据源。此外,我没有看到任何事件可以在 Word 中挂钩这样的关闭方法
-
这就是为什么输出文本文件并将其用于 Access 邮件合并通常更容易的原因。我经常使用简化版:tek-tips.com/faqs.cfm?fid=5088