XL 2019 Instance Word reste ouverte après fermeture Excel contenant objet Word (OLE)

Vlad1

XLDnaute Nouveau
Bonjour à tous,

J'ai un fichier Excel qui contient un objet Word (fichier Word intégré).

Le problème c'est que quand cet objet est ouvert et que je ferme le fichier Excel, le document disparait mais l'instance Word reste active (sans document actif).
Je voudrais que cette instance se ferme quand je ferme le fichier Excel, sans avoir à cliquer manuellement sur fermer.

J'ai essayé une macro de fermeture type Workbook_BeforeClose qui identifie s'il y a une instance Word ouverte sans document actif (pour éviter de fermer d'autres documents potentiellement ouverts) mais ça ne fonctionne pas à cause de l'ordre d'occurrence des évènements : d'abord ma macro s'exécute et seulement ensuite le fichier se ferme, et donc le problème survient.

Est-ce que quelqu'un a une solution ?

Merci d'avance! :)

Vlad
 
Solution
Merci mais imaginons que l'utilisateur a d'autres fichiers Word ouverts, dans ce cas ta macro force fermeture de Word alors que cela n'est pas souhaité.

J'ai finalement trouvé une situation de contournement qui enregistre l'objet en tant que .docx sur le dd sans l'ouvrir, puis ordonne l'ouverture du fichier en question. Ainsi on traite avec un fichier Word et plus un objet ouvert et le problème à la fermeture d'Excel n'est plus !

Voici la macro d'enregistrement que j'ai trouvé, si d'autres personnes ont le problème :
VB:
Sub SaveEmbedded()
Dim sh As Shape
Dim objWord As Object ''Word.Document
Dim objOLE As OLEObject

    ''The shape holding the object from 'Create from file'
    ''Object 2 is the name of the shape
    Set sh =...

job75

XLDnaute Barbatruc
Bonjour Viad1,

Supposons que l'objet Word est représenté par la variable Wapp.

D'abord cette variable doit être une variable déclarée Public.

Ensuite dans ThisWorkbook vous collerez cette macro :
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next 'si Word n'eqt pas ouvert
Wapp.ActiveDocument.Saved = True
If Wapp.Documents.Count < 2 Then Wapp.Quit Else Wapp.ActiveDocument.Close
End Sub
A+
 

Vlad1

XLDnaute Nouveau
Hello Job75,

Merci pour ton retour.

Le soucis c'est que ça ne prend pas en compte plusieurs situations. Le problème rencontré survient quand l'objet a été généré, que l'utilisateur ferme le fichier alors qu'il n'y a aucun autres document Word ouvert.

En fait je me rend compte que le coeur du problème c'est l'objet Word.

Comme solution de contournement pour le moment ce que je fais par macro c'est que j'ouvre l'objet, je l'enregistre, je quitte Word et j'ouvre le dernier fichier enregistré (qui du coup n'est plus un objet mais un fichier classique), mais c'est très lourd comme procédure..

Il me faudrait une solution pour enregistrer l'objet sans l'ouvrir, si un petit génie sait comment faire 😀
 

Vlad1

XLDnaute Nouveau
Merci mais imaginons que l'utilisateur a d'autres fichiers Word ouverts, dans ce cas ta macro force fermeture de Word alors que cela n'est pas souhaité.

J'ai finalement trouvé une situation de contournement qui enregistre l'objet en tant que .docx sur le dd sans l'ouvrir, puis ordonne l'ouverture du fichier en question. Ainsi on traite avec un fichier Word et plus un objet ouvert et le problème à la fermeture d'Excel n'est plus !

Voici la macro d'enregistrement que j'ai trouvé, si d'autres personnes ont le problème :
VB:
Sub SaveEmbedded()
Dim sh As Shape
Dim objWord As Object ''Word.Document
Dim objOLE As OLEObject

    ''The shape holding the object from 'Create from file'
    ''Object 2 is the name of the shape
    Set sh = ActiveSheet.Shapes("Object 2")

    ''Activate the contents of the object
    sh.OLEFormat.Activate

    ''The OLE Object contained
    Set objOLE = sh.OLEFormat.Object

    ''This is the bit that took time
    Set objWord = objOLE.Object

    ''Easy enough
    objWord.SaveAs2 Filename:="c:docs    emplate.dot", FileFormat:= _
    wdFormatTemplate ''1=wdFormatTemplate
End Sub
 

Vlad1

XLDnaute Nouveau
J'ai testé la macro.

Sauf que si l'utilisateur a un fichier Word actif autre que l'objet parce qu'il n'a pas lancé la macro de l'objet ?

Cette macro ne prend pas en compte cette situation et le fichier actif sera fermé sans que ce soit voulu.
 

job75

XLDnaute Barbatruc
Eh bien au lieu de fermer le fichier actif fermez le fichier qui vous intéresse.

Ce fichier doit être repéré par une variable Wdoc elle aussi déclarée Public.

La macro dans ThisWorkbook devient :
VB:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next 'si Word n'eqt pas ouvert
Wdoc.Saved = True
If Wapp.Documents.Count < 2 Then Wapp.Quit Else Wdoc.Close
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
315 144
Messages
2 116 721
Membres
112 845
dernier inscrit
dadal10