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アプリケーションインスタンスへの参照でない場合、VBAはエラーをスローします...そして使用strDocPathしていない場合: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

I don't use the New keyword when opening or finding an application.

This is the code I use for 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

(note also the On Error GoTo 0 - I don't want the resume next to be active all through the code)

于 2012-08-08T16:20:16.343 に答える
0

GiveMeAnApp関数は、私が経験していたのと同様の問題でうまく機能しました。ただし、データのマージ後にWord文書を閉じて、Wordへのデータの別のマージを試みた場合のエラー462(サーバーに接続できないなど)を回避するため。(エラー462が発生しました)これを行いました:GiveMeAnAppを呼び出すと、Wordにデータを転送したいWordテンプレートを呼び出す前に、新しいWordドキュメントを呼び出しました。

私の状況では、常にNew Wordドキュメントにこの回避されたエラー462を提示させることにより、これは、空のWordドキュメントが残っていることを意味しますが、これは私にとっては問題なく、データベースを終了して再度開き、Wordagaへのマージを実行するという他の唯一の解決策よりも望ましい方法です。

このスレッドで説明されているヘルプに感謝します。皆さんありがとう。

于 2014-08-06T12:42:52.810 に答える