2016-05-10 58 views
-1

我有一個項目,需要我在Word中打開文檔並等待文檔打開。用戶然後需要編輯文檔,打印或保存文檔,然後手動關閉文檔。當文檔(或Word本身)關閉時,我想在Access中繼續使用我的VBA腳本。MS Access VBA檢查Word是否已關閉?

我有以下代碼

If Len(Dir(sDocName)) > 0 Then 
    Dim wordApp As Word.Application 
    Dim wordDoc As Word.Document 

    ' Launch Word 
    Set wordApp = New Word.Application 

    ' Open the document 
    With wordApp 
     Set wordDoc = .Documents.Open(sDocName, , False) 

     ' Pass data 
     With wordDoc 
      .Variables("bmArchitectCompanyName").Value = "Hello" 
      .Variables("bmArchitectCompanyAddress").Value = "Hello" 
      .Variables("bmArchitectCompanyPostCode").Value = "Hello" 
      .Variables("bmArchitectContactFirstName").Value = "Hello" 
      .Variables("bmProjectTitle").Value = ProjectTitle 
      .Fields.Update 
     End With 
     .Visible = True 
     .Activate 

     Do Until wordApp Is Nothing 
      ' Wait for Word to be closed 
     Loop 

     ' Display a success message 
     MsgBox "Success!" 
    End With 
End If 

然而,做循環永遠不會退出。

如何檢查通過VBA啓動的文檔是否已由用戶從我的VBA代碼中關閉?

+0

你在哪裏關閉wordApp?由於它仍在運行,循環將永遠不會停止。 – INOPIAE

+0

我將在if語句(未包含在上面)後關閉wordApp對象。一旦我知道應用程序已被用戶關閉,我會將對象設置爲Nothing。我需要知道應用程序何時關閉。 – alcomcomputing

+0

所以等待循環必須包含一個DoEvents循環,然後檢查文檔是否關閉,否則coninue DoEvents循環。 –

回答

0

您必須使用DoEvents屈服於操作系統,然後檢查文檔是否關閉,否則coninue DoEvents循環。以下是我不幸測試不到的大綱代碼。

Do 
     DoEvents 
     For i = 1 to wordApp.Documents.Count 
      If (wordApp.Documents(i).Name = sDocName) Then Exit For 
     Next i 
     If (i > wordApp.Documents.Count) Then Exit Loop 
    Loop While (True) 

注意:您可能不想關閉應用程序,因爲用戶可能打開了其他文檔。也許你應該測試一下。

+0

我用這種方法得到的錯誤(以及幾乎所有其他錯誤)是運行時錯誤'462':遠程服務器機器不存在或不可用。調試在行停止對於i = 1到wordApp.Documents.Count。我懷疑是因爲單詞已關閉,對象不再有效。 Nothing對象也不是。我需要測試我認爲的對象。 – alcomcomputing

0

我已經找到了解決辦法...

Do While .Visible 
     ' wait until the window is no longer visible  
Loop 

不正是我一直在尋找,等待,直到字被關閉,然後用MS訪問VBA腳本繼續。

+0

儘管_what_可見? wordApp或wordDoc? –

+0

這個循環替換原來的文章中的直到循環。所以它是wordApp。 – alcomcomputing

+0

如果您在Access創建的Word實例中打開另一個文檔,然後關閉Access打開的文檔,會發生什麼情況? –

0

基於Paul輸入的內容,使用不同的方法來測試文檔是否打開。

Sub Test() 

    Dim wordApp As Word.Application 
    Dim wordDoc As Word.Document 
    Dim sDocName As String 

    sDocName = "<Full path to document>" 

    Set wordApp = New Word.Application 

    With wordApp 
     Set wordDoc = .Documents.Open(sDocName, , False) 
     .Visible = True 
     .Activate 

     Do 
      DoEvents 
     Loop While FileIsOpen(sDocName) 

    End With 

    MsgBox "Finished" 

End Sub 

Public Function FileIsOpen(FullFilePath As String) As Boolean 

    Dim ff As Long 

    On Error Resume Next 

    ff = FreeFile() 
    Open FullFilePath For Input Lock Read As #ff 
    Close ff 
    FileIsOpen = (Err.Number <> 0) 

    On Error GoTo 0 

End Function 
0

與檢查,看看是否wordApp Is Nothing是VBA不知道取消引用對象時其外部關閉了該問題。換句話說,當wordApp引用的文檔關閉時,指向該對象的指針變成虛假但不是Nothing。要捕獲的事件,您可以在出現錯誤做在環路的文檔對象的無意義的通話,並退出:

On Error Resume Next 
With wordDoc 
    Do 
    DoEvents 
    'This will only occur if there is an error: 
    If .Visible<>.Visible Then Exit Do 
    Loop 
End With 
Err.Clear 
On Error Goto 0 
0

我只是沒有迴路或其他任何測試。 Access中的宏代碼等待,直到Word應用程序的實例在完成執行之前關閉。下面是我測試過,並MSGBOX後,才退出Word執行:要確保將對象設爲Nothing或 你很有可能在未來的時間遇到​​錯誤信息

' Open the document 
With wordApp 
    Set wordDoc = .Documents.Add 

    ' Pass data 
    With wordDoc 
     .Variables("bmArchitectCompanyName").Value = "Hello" 
     .Variables("bmArchitectCompanyAddress").Value = "Hello" 
     .Variables("bmArchitectCompanyPostCode").Value = "Hello" 
     .Variables("bmArchitectContactFirstName").Value = "Hello" 
     .Content.Text = "test" 
     '.Variables("bmProjectTitle").Value = ProjectTitle 
     '.Fields.Update 
    End With 
    .Visible = True 
    .Activate 

    ' Display a success message 
    MsgBox "Success!" 
    Set wordDoc = Nothing 
    Set wordApp = Nothing 
End With 

注你運行代碼 ,因爲它會讓WinWord的實例在內存中打開。

+0

這對我不起作用。腳本運行,並且在單詞打開時顯示消息框。我需要MS Access等到Word關閉。 – alcomcomputing

0

如果您在類模塊或窗體模塊處理Word文檔,請嘗試聲明一個Word.Document對象是這樣的:

Dim WithEvents w As Word.Document 

,那麼你可以使用Word.Document對象事件「關閉「:

Private Sub w_Close() 

    'Things you want to do when the Word.Document is closed 

    'reset object 
    set w=nothing 

End Sub 

您不能讓」容器「窗體關閉或者對象終止,除非w不爲空。表單或對象是安靜的(或任何你想要他們做的),直到你的Word文檔被關閉。

+0

謝謝,但我不需要處理關閉事件,只需檢測關閉事件。 – alcomcomputing

+0

@alcomcomputing我最初想要提出這種方法,但無法讓它與Access中的類一起工作,這是您的代碼執行的地方。但是,如果它確實可行,那麼當事件觸發時,您可以調用更多代碼 - IOW將隨後將命令發送到Word(MsgBox)的代碼。但是,您需要在聲明代碼的末尾釋放對象。 –

+0

@alcomcomputing處理和檢測關閉事件沒有區別。對我而言,它們與檢測Word文檔的結束時相同,因此您必須首先處理關閉事件。我不知道其他方式。 –