Discussione:
Controlla se un documento Word è aperto
(troppo vecchio per rispondere)
bizkit82
2009-03-26 16:50:05 UTC
Permalink
Ciao a tutti,
è da un pò di tempo se sto cercando su internet una function in VBA che mi
permetta di controllare da Excel se un determinato documento Word è aperto.

Questo è quello che sono riuscito a trovare:

Function DocOpen(ByVal DocumentName As String) As Boolean

DocOpen = False
On Error GoTo Fine
If Len(Word.Application.Documents(DocumentName).Name) > 0 Then
DocOpen = True
End If

Fine:
End Function


Non sempre funziona. Mi spiego: ho una macro su un foglio .xls che mi apre
un determinato documento .doc. Ovviamente prima di aprirlo verifica:
1- che esista il percorso
2- che il documento non sia già aperto

Se il file .doc lo apro manualmente (il classico doppio click), la function
riportata sopra funziona e mi dice che è già aperto. Se il file .doc invece
lo apro tramite la procedura automatica dal file .xls, non funziona (secondo
la function il file NON è aperto).

Qualcuno di voi è a conoscenza di qualcosa di più efficace?

Grazie mille.

Ciao
bizkit82
Roberto Restelli
2009-03-27 14:51:44 UTC
Permalink
Ciao bizkit82.
Post by bizkit82
è da un pò di tempo se sto cercando su internet una function in VBA
che mi permetta di controllare da Excel se un determinato documento
Word è aperto.
Function DocOpen(ByVal DocumentName As String) As Boolean
DocOpen = False
On Error GoTo Fine
If Len(Word.Application.Documents(DocumentName).Name) > 0 Then
DocOpen = True
End If
End Function
Ok.
Post by bizkit82
Non sempre funziona.
[CUT]
Post by bizkit82
Se il file .doc lo apro manualmente (il classico doppio click), la
function riportata sopra funziona e mi dice che è già aperto. Se il
file .doc invece lo apro tramite la procedura automatica dal file
.xls, non funziona (secondo la function il file NON è aperto).
Quale versione di Office stai utilizzando?
Dovresti provare a fare qualche debug per capire meglio cosa sta succedendo.
Il codice della funzione riportato sopra cerca nella collection degli
oggetti ".Documents" di Word se esiste un documento che è stato indicizzato
con il nome del documento. Io proverei a verificare quanti documenti sono
presenti all'interno della collection e con quali nomi, usando
l'enumeratore.

Prova a fare girare la seguente procedura, dopo aver caricato un documento
manualmente ed uno automaticamente. Vediamo cosa ti restituisce.

===
Sub ElencoDocumentiWord()
Dim aWord As Object, oDoc As Object
Dim sText As String
Dim iDoc As Long

On Error Resume Next
'Recupera il riferimento all'istanza di Word
Set aWord = GetObject(, "Word.Application")
If Err.Number <> 0 Then
MsgBox "Non è stato possibile trovare l'istanza di Word", vbExclamation
Exit Sub
End If
On Error GoTo 0

'verifica quanti documenti sono aperti in Word.
l = aWord.Documents.Count
sText = "Sono stati trovati " & l & " documento/i:" & vbCrLf
'recupera il nome dei documenti trovati.
For Each oDoc In aWord.Documents
sText = sText & oDoc.Name & vbCrLf
Next oDoc

'pulizia delle variabili
Set oDoc = Nothing: Set aWord = Nothing

MsgBox sText, vbInformation
End Sub
===

Penso che il codice sia abbastanza semplice da capire.

Ciao
Roberto
--
Roberto Restelli
Microsoft MVP - Office Systems - Outlook
************************************************
La prima raccolta delle FAQ del newsgroup Microsoft di Outlook:
http://www.msoutlook.it
bizkit82
2009-03-27 15:48:07 UTC
Permalink
Ciao Roberto,
innanzitutto ti ringrazio per la risposta.

Purtroppo anche con la tua macro ho lo stesso risultato, però grazie a
quella ho scoperto che i file aperti in questo modo non sembrano essere
presente nella collection degli oggetti ".Documents".

Da questo deduco che in qualche modo sbaglio ad aprire il file:

Set wrdApp = CreateObject("Word.Application")
wrdApp.Visible = True
wrdApp.Documents.Open Filename:="C:\Prova.xls"

Aggiungo che ho Office 2007.


Ciao e grazie.
bizkit82
Post by Roberto Restelli
Quale versione di Office stai utilizzando?
Dovresti provare a fare qualche debug per capire meglio cosa sta succedendo.
Il codice della funzione riportato sopra cerca nella collection degli
oggetti ".Documents" di Word se esiste un documento che è stato indicizzato
con il nome del documento. Io proverei a verificare quanti documenti sono
presenti all'interno della collection e con quali nomi, usando
l'enumeratore.
Prova a fare girare la seguente procedura, dopo aver caricato un documento
manualmente ed uno automaticamente. Vediamo cosa ti restituisce.
Roberto Restelli
2009-03-27 16:27:54 UTC
Permalink
Ciao bizkit82.
Post by bizkit82
Purtroppo anche con la tua macro ho lo stesso risultato, però grazie a
quella ho scoperto che i file aperti in questo modo non sembrano
essere presente nella collection degli oggetti ".Documents".
Eh, no! Il problema sta nel fatto che stai aprendo una nuova istanza di
Word.Application, (praticamente apri un secondo Word), quindi è normale che
nella collection dei Documents di una istanza non trovi i Documents
dell'altra... :-)
Post by bizkit82
Set wrdApp = CreateObject("Word.Application")
wrdApp.Visible = True
wrdApp.Documents.Open Filename:="C:\Prova.xls"
Aggiungo che ho Office 2007.
Confermo!
Se hai già un'istanza aperta di Word, perchè non riutilizzare la stessa?
Il codice è facilmente modificabile. Anzichè usare direttamente la
"CreateObject" prova ad usare per prima la "GetObject"; se quest'ultima
fallisce significa che Word non è aperto, ed a quel punto puoi creare una
nuova istanza.
Questo è un esempio di codice:
===
On Error Resume Next
'Cerca di recuperare un'eventuale istanza
' già aperta di Word.
Set wrdApp = GetObject(, "Word.Application")
'Se viene generato un errore significa che
' nessuna istanza è stata trovata, quindi
' provvede a crearne una.
If Err.Number <> 0 Then
'Crea una nuova istanza di Word.
Set wrdApp = CreateObject("Word.Application")
End If
wrdApp.Visible = True
'...
===

Ciao
Roberto
--
Roberto Restelli
Microsoft MVP - Office Systems - Outlook
************************************************
La prima raccolta delle FAQ del newsgroup Microsoft di Outlook:
http://www.msoutlook.it
bizkit82
2009-03-28 07:33:01 UTC
Permalink
Ciao Roberto,
è vero, è proprio come hai detto tu.
Non mi rendevo conto che quando aprivo il file automaticamente mi creava una
nuova istanza. Ho modificato il codice come da tuo esempio e ora funziona
alla grande. Grazie mille.

P.S.: ne approfitto per chiederti un'ultima cosa: se il documento è già
aperto, come faccio a metterlo in primo piano? Con Excel uso
Workbooks(File).Activate, ma col Word non funziona.

Ciao e grazie ancora.
bizkit82
Post by Roberto Restelli
Eh, no! Il problema sta nel fatto che stai aprendo una nuova istanza di
Word.Application, (praticamente apri un secondo Word), quindi è normale che
nella collection dei Documents di una istanza non trovi i Documents
dell'altra... :-)
r
2009-03-28 23:19:01 UTC
Permalink
Post by bizkit82
Ciao Roberto,
è vero, è proprio come hai detto tu.
Non mi rendevo conto che quando aprivo il file automaticamente mi creava una
nuova istanza. Ho modificato il codice come da tuo esempio e ora funziona
alla grande. Grazie mille.
P.S.: ne approfitto per chiederti un'ultima cosa: se il documento è già
aperto, come faccio a metterlo in primo piano? Con Excel uso
Workbooks(File).Activate, ma col Word non funziona.
Sub WordShow()
Dim WA As Word.Application
'con riferimenti alla libreria di word
'giusto per cambiare qualcosa :-)
On Error Resume Next

Set WA = Word.Application

If Err Then
Set WA = New Word.Application
End If

On Error GoTo 0

WA.Visible = True
WA.WindowState = wdWindowStateMaximize
WA.Activate

End Sub

saluti
r
--
-------------------------------------------------------------------------------------
http://excelvba.altervista.org/blog/index.php/Table/Excel-VBA/
bizkit82
2009-03-30 07:07:01 UTC
Permalink
Grazie mille, r, è perfetto.

Ciao
bizkit82
Post by r
Sub WordShow()
Dim WA As Word.Application
'con riferimenti alla libreria di word
'giusto per cambiare qualcosa :-)
On Error Resume Next
Set WA = Word.Application
If Err Then
Set WA = New Word.Application
End If
On Error GoTo 0
WA.Visible = True
WA.WindowState = wdWindowStateMaximize
WA.Activate
Continua a leggere su narkive:
Loading...