1

我在 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

任何帮助表示赞赏。提前致谢。

4

3 回答 3

2

“当我单步调试调试器时,它不会抛出任何错误,但有时它不会打开 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"

然后,当您尝试打开时,如果不是对 Word 应用程序实例的引用strDocPath,VBA 会抛出错误......并且您没有使用过:appWordOn Error Resume Next

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

On Error Resume Next如果您将作业更改为此,您可以摆脱appWord

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
于 2012-08-08T17:48:20.727 回答
1

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- 我不希望下一个简历在整个代码中都处于活动状态)

于 2012-08-08T16:20:16.343 回答
0

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

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

我很感谢这个线程中提供的帮助。谢谢大家。

于 2014-08-06T12:42:52.810 回答