2016-08-19 3 views
0

Zu Beginn habe ich eine Funktion in VBA Excel, die mir sagt, ob ein Word-Dokument geöffnet oder nicht geöffnet ist. Zu Testzwecken habe ich das Word-Dokument nicht geöffnet und erwarte, dass 'Falsch' zurückgegeben wird.VBA Excel - Makro sagt mir Word-Dokument ist offen, obwohl es nicht geöffnet ist

Function IsFileOpen(filename As String) As Boolean 
     Dim filenum As Integer, errnum As Integer 

     On Error Resume Next ' Turn error checking off. 
     filenum = FreeFile() ' Get a free file number. 
     ' Attempt to open the file and lock it. 
     Open filename For Input Lock Read As #filenum 
     Close filenum   ' Close the file. 
     errnum = Err   ' Save the error number that occurred. 
     On Error GoTo 0  ' Turn error checking back on. 

     ' Check to see which error occurred. 
     Select Case errnum 

      ' No error occurred. 
      ' File is NOT already open by another user. 
      Case 0 
      IsFileOpen = False 

      ' Error number for "Permission Denied." 
      ' File is already opened by another user. 
      Case 70 
       IsFileOpen = True 

      ' Another error occurred. 
      Case Else 
       Error errnum 
     End Select 

    End Function 

Genannt Via:

... 
If IsFileOpen("C:/Temp/test.docx") = True Then 
MsgBox objWord.ActiveDocument.Name & " already open" 'ERROR FROM PIC HERE 
Set objDoc = objWord.ActiveDocument 
Else 
Set objDoc = objWord.Documents.Open("C:/Temp/test.docx", Visible:=True) 
End If 
... 

jedoch, wenn der Code ausgeführt wird ich, dass das Dokument geöffnet ist (True zurückgegeben von der IsFileOpen Funktion von Fall 70) aber ich erhalte eine Fehlermeldung auf ‚objWord.ActiveDocument .name‘, dass kein Dokument

enter image description here

Auf Windows 7 Task-Manager geöffnet ist, ist es das, was ich habe. Word-Anwendung ist geschlossen, aber es scheint, dass Hintergrundprozesse von Word geöffnet sind. Jedoch habe ich alle Dokumente schließe ich nicht verwenden, so sollten diese Prozesse nicht laufen

enter image description here

+0

Was ist der Debugger Ihnen sagen, wenn Sie einen Haltepunkt auf 'wenn IsFileOpen' und Schritt durch den Code festgelegt? –

+0

Zunächst müssen Sie Ihre Object-Probleme in VBA beheben - stellen Sie sicher, ob objWord recht und dereferenziert ist, wenn Sie Ihr VBA-Modul beenden. Es scheint, dass Sie hinter den Kulissen viele Word-Prozesse geöffnet haben. Da Sie Word nicht sichtbar machen, können Sie sie nicht sehen, um sie manuell zu schließen, und weil Sie Word in Ihrem Code nicht beenden, bleiben sie herum. – dbmitch

+0

Sie haben verschiedene Instanzen von Word (was wahrscheinlich daran liegt, dass Sie niemals die Instanz schließen, sondern nur das Dokument). "Dokumente" aus Ihrer Instanz und "Dokumente" aus diesen Instanzen sind unterschiedliche "Dokumente". Ihr gesamter Ansatz ist jedoch falsch, und abhängig von Ihrem eigentlichen Ziel müssen Sie sich entweder nur um Ihre eigenen 'Dokumente' kümmern oder sich [GetObject] ansehen (https://msdn.microsoft.com/en-us/library/ Büro/gg251785.aspx). – GSerg

Antwort

0

Ich denke, ein besserer Test, um zu überprüfen, ob Ihre Word-Datei geöffnet wird, um die tatsächliche Word-Dokumente Sammlung verwenden

So für Ihr Beispiel, verwenden Sie so etwas wie folgt aus:

With objWord 
     For Each doc In .Documents 
      If doc.Name = "test.docx" Then 
       found = True 
       Exit For 
      End If 
     Next doc 
     If found <> True Then 
      .Documents.Open FileName:="C:/Temp/test.docx" 
     Else 
      .Documents("test.docx").Activate 
     End If 
    End With 
Verwandte Themen