VBA 导入 MS Access 到 MS Word

Posted

技术标签:

【中文标题】VBA 导入 MS Access 到 MS Word【英文标题】:VBA Import MS Access to MS Word 【发布时间】:2012-08-08 16:13:28 【问题描述】:

我在 MS-Access 中有一个 VBA 模块,它应该将数据从数据库加载到 MS-Word 文档的表单域中。我认为它工作正常,但它似乎不一致。有时它有效,有时则无效。我不知道是什么让它无法工作。当我单步调试调试器时,它不会抛出任何错误,但有时它不会打开 MS-Word。

以下是相关代码:

Dim appWord As Word.Application
Dim doc As Word.Document
'Avoid error 429, when Word isn't open.
On Error Resume Next
Err.Clear

'Set appWord object variable to running instance of Word.
Set appWord = GetObject(, "Word.Application")

If Err.Number <> 0 Then
'If Word isn't open, create a new instance of Word.
Set appWord = New Word.Application
End If

Set doc = appWord.Documents.Open("\\srifs01\hresourc\EHS Department\EHS Database\IpadUpload\Lab Inspection Deficiency Resolution Report.docx", , True)

'Sometimes word doesn't open and I think the issue is around here.
With doc
.FormFields("frmID").Result = Me!id
.FormFields("frmSupervisor").Result = Me!LabPOC
.FormFields("frmInspector").Result = Me!InspectorName
.FormFields("frmBuilding").Result = Me!BuildingName
.FormFields("frmRoom").Result = Me!Rooms
.FormFields("frmComments").Result = Me!Comments
.Visible = True
.Activate
.SaveAs "'" & Me!id & "'"
.Close
End With

Set doc = Nothing
Set appWord = Nothing

感谢任何帮助。提前致谢。

【问题讨论】:

您收到的错误消息的确切措辞是什么? 没有错误信息。有时它只是行不通。它通过但什么也不做。我认为是因为它没有打开 MS-Word。 您似乎没有关闭 Word。 (appWord.Quit) 您是否在任务管理器中显示副本? 我在With doc .Close中结束词 您正在关闭文档,您不一定要关闭 Word。 【参考方案1】:

“当我单步调试调试器时,它不会抛出任何错误,但有时它不会打开 MS-Word。”

那是因为你有On Error Resume Next。这指示 VBA 忽略错误。

假设您已在代码中进行了此更改...

Dim strDocPath As String
strDocPath = "\\srifs01\hresourc\EHS Department\EHS Database" & _
    "\IpadUpload\Lab Inspection Deficiency Resolution Report.docx"

然后,当您尝试打开 strDocPath 时,如果 appWord 不是对 Word 应用程序实例的引用,VBA 将抛出错误...并且您没有使用 @ 987654325@:

Set doc = appWord.Documents.Open(strDocPath, , True)

如果您将 appWord 的分配更改为以下内容,则可以摆脱 On Error Resume Next

Set appWord = GiveMeAnApp("Word.Application")

如果 Word 已经在运行,GiveMeAnApp() 将锁定该应用程序实例。如果 Word 没有运行,GiveMeAnApp() 将返回一个新实例。

无论哪种方式,GiveMeAnApp() 都不需要您在调用它的过程中使用On Error Resume Next。而是在那里包含一个适当的错误处理程序。并且您可以将该功能重用于其他类型的应用程序:GiveMeAnApp("Excel.Application")

Public Function GiveMeAnApp(ByVal pApp As String) As Object
    Dim objApp As Object
    Dim strMsg As String

On Error GoTo ErrorHandler

    Set objApp = GetObject(, pApp)

ExitHere:
    On Error GoTo 0
    Set GiveMeAnApp = objApp
    Exit Function

ErrorHandler:
    Select Case Err.Number
    Case 429 ' ActiveX component can't create object
        Set objApp = CreateObject(pApp)
        Resume Next
    Case Else
        strMsg = "Error " & Err.Number & " (" & Err.Description _
            & ") in procedure GiveMeAnApp"
        MsgBox strMsg
        GoTo ExitHere
    End Select
End Function

您还可以检查以确保appWord 在您尝试使用应用程序之前引用它。虽然我不明白为什么在你的情况下应该进行这样的检查,但你可以尝试这样的事情......

If TypeName(appWord) <> "Application" Then
    ' notify user here, and bail out '
Else
    ' appWord.Visible = True '
    ' do stuff with Word '
End If

【讨论】:

我想这样更好。但它仍然没有打开 MS-Word,它仍然没有抛出错误。 我不明白它为什么无法在不引发错误的情况下为您提供 Word 实例。 (您可能有SetWarnings = False 吗?隐藏信息可能会有风险,但我不会在这里怀疑。)我添加了一个更新以检查appWord 是否是应用程序引用。看看有没有帮助。 经过仔细检查,它看起来像是在进程中打开了一个单词的实例,但我实际上并没有看到它打开。它也不会将 MS-Access 数据导入其中或将其保存为新文件。 Document .SaveAs 包含您要创建的文件的完整路径。 (废话!你的最后一个问题消失了。) 是的,我回答了我自己的问题。我想我应该留下它以备将来参考。问题是“如何保存到特定文件夹而不是我的文档?”【参考方案2】:

我在打开或查找应用程序时不使用 New 关键字。

这是我用于 excel 的代码:

On Error Resume Next
Set xlApp = GetObject(, "Excel.Application")
If Err.Number = 429 Then 'Excel not running
    Set xlApp = CreateObject("Excel.Application")
End If
On Error GoTo 0

(另请注意On Error GoTo 0 - 我不希望下一个简历在整个代码中都处于活动状态)

【讨论】:

@talbright GetObject 用于返回 Word 的运行实例。我很喜欢New,但是如果你使用它,你就不要使用getobject,如果你使用getobject,你需要上面显示的所有代码。我还要确保我的实例是可见的。 当我使用上面的代码Set appWord = CreateObject(, "Word.Application")它会抛出一个编译错误。 CreateObject 将对象的名称作为第一个参数 - get object 使用第二个参数。删除逗号,它应该可以工作【参考方案3】:

GiveMeAnApp 功能非常适合我,因为我遇到了类似的问题。除了,如果我在数据合并后关闭 Word 文档并尝试再次将数据合并到 Word 中,以避免出现错误 462(无法连接到服务器等)。 (导致错误 462)我这样做了:一旦我调用 GiveMeAnApp,我就调用了一个新的 Word 文档,然后再调用我希望将数据传输到 Word 的 Word 模板。

在我的情况下,通过始终显示新 Word 文档,这避免了错误 462。这意味着我留下了一个空的 Word 文档,但这对我来说没问题,并且比我能想出的唯一其他解决方案更可取,即退出数据库并重新打开并运行合并到 Word aga。

感谢本帖中提供的帮助。谢谢大家。

【讨论】:

以上是关于VBA 导入 MS Access 到 MS Word的主要内容,如果未能解决你的问题,请参考以下文章

MS Access:导入规范无法通过 VBA

MS ACCESS TransferSpreadsheet VBA 在导入数据中包含额外信息

如何使用sql语句和vba将数据从MS-Access导入excel power查询?

MS Access VBA 解析 XML 文件

MS Access VBA DoCmd.TransferText 如何分隔列?

MS Access/ VBA:将 if 条件添加到 vba 代码