Excel et Word

Y compris Power BI, Power Query et toute autre question en lien avec Excel
s
sebien0077
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 18 septembre 2014
Version d'Excel : 2013 FR

Message par sebien0077 » 21 juin 2016, 15:45

Bonjour,

je cherche depuis plusieurs jours et rien, alors si qqun peut m'aider ... :)

Voilà, je cherche à faire en sorte qu'un bouton, ouvre un document présent dans un répertoire. Ce document est un fichier word.
Je voudrais laisser à l'utilisateur la possibilité de faire les changement désirés et qu'une fois qu'il à fini et qu'il veuille quitter son fichier word, pouvoir intercepter la fermeture, renommer le fichier d'une autre façon (en mettant la date du jour à la fin) et en historisant dans un dossier Archive, le fichier d'origine.

Je voudrait en gros garder le contrôle des Event word à partir de mes macro Excel.

Est-ce que quelqu'un peut m'aider?

Je vous en remercie par avance !
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'567
Appréciations reçues : 215
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 21 juin 2016, 19:28

Bonjour,

Il faut bien sûr ajouter la bibliothèque de référence Microsoft Word et ensuite

Etape 1 : Référencer et activer les événements Word dans "This Workbook" comme ceci
Dim Wd As Word.Application
Private WithEvents EvtsWord As Word.Application
Private WithEvents EvtsDoc As Word.Document
Private Sub Workbook_Open()
    
    'création instance application Word
     Set Wd = CreateObject("Word.Application")
    'active les événements de l'application Word
     Set EvtsWord = Wd.Application
    
End Sub
Private Sub EvtsWord_WindowActivate(ByVal Doc As Word.Document, ByVal Wn As Word.Window)

    'active les événements du document actif de Word
     Set EvtsDoc = Wd.ActiveDocument

End Sub
Private Sub EvtsDoc_Close()
    
    Stop
    '<votre macro>

End Sub
Etape 2: créer votre module comme suit, en rappelant l'instance de l'application Word créée à l'ouverture du classeur
Dim Wd As Word.Application
Sub ouverture_document()
    
    'récupération application Word
     Set Wd = GetObject(, "Word.Application")

    'ouverture fichier Word
     nom_fichier = "D:\Documents\test1.docx"
    Wd.Documents.Open Filename:=nom_fichier
    Wd.Visible = True  'affichage application
   

End Sub

Pour que cela fonctionne, une seule instance de l'application Word doit s'exécuter.
s
sebien0077
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 18 septembre 2014
Version d'Excel : 2013 FR

Message par sebien0077 » 23 juin 2016, 01:48

C'est une bonne piste merci.

par contre, je ne comprends pas pourquoi, qd j’exécute ta macro, ca fonctionne la première fois, mais pas la seconde, je tombe sur une erreur 429 : "un composant activex ne peut pas créer un objet"
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'567
Appréciations reçues : 215
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 23 juin 2016, 10:53

Cela signifie que tu fermes le premier document et que tu essaies d'en ouvrir un autre.
La fermeture du premier document implique l'arrêt de l'instance de l'application Word. tu ne peux pas ouvrir un second document sans redémarrer une instance Word.
Pour le moment, une instance Word n'est démarrée qu'à l'ouverture de ton classeur.
s
sebien0077
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 18 septembre 2014
Version d'Excel : 2013 FR

Message par sebien0077 » 23 juin 2016, 17:14

Merci bcp pour ton aide.
encore une question, j'ai voulu adapté ton code, en mettant le contenu de Thisdocument dans un module et en créant un module de class pour le reste.
mais visiblement, je perd le contrôle.
tu as une explication?
le modul de classe myWord :
Option Explicit
Dim wd As Word.Application
Public WithEvents EvtsWord As Word.Application
Public WithEvents EvtsDoc As Word.Document

Private Sub Class_Initialize()

    'création instance application Word
    On Error Resume Next
    Set wd = GetObject(, "Word.application")
    If Err.Number = 0 Then
        Set wd = GetObject(, "Word.application")
    Else
        Set wd = CreateObject("Word.Application")
        Set wd = GetObject(, "Word.Application")
    End If
    'active les événements de l'application Word
    Set EvtsWord = wd.Application
    'récupération application Word
    'Set wd = GetObject(, "Word.Application")

End Sub

Private Sub EvtsDoc_Open()
    MsgBox "Word ouvert"
End Sub

Private Sub EvtsWord_WindowActivate(ByVal Doc As Word.Document, ByVal Wn As Word.Window)

    'active les événements du document actif de Word
    Set EvtsDoc = wd.ActiveDocument

End Sub

Private Sub EvtsDoc_Close()
    MsgBox "Word fermé"
    'Stop
    '<votre macro>

End Sub
le module remplaçant thisoducment:
Public wd As Word.Application
Sub test_ouverture_document()
    Dim wdt As New MyWord
    Dim nom_fichier As String
    'récupération application Word
    
    'Set wd = GetObject(, "Word.Application")

    'ouverture fichier Word
    nom_fichier = "C:\document.docx"
    wdt.EvtsWord.Documents.Open fileName:=nom_fichier
    wdt.EvtsWord.Visible = True  'affichage application
  
End Sub
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'567
Appréciations reçues : 215
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 23 juin 2016, 20:05

Je vais regarder et te fournir une réponse demain.
s
sebien0077
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 18 septembre 2014
Version d'Excel : 2013 FR

Message par sebien0077 » 24 juin 2016, 10:06

Merci c'est gentil.

En fait, si tu veux des détails sur mon idée de macro c'est:
- Faire un bouton qui :
- soit charge le document word (si c'est du word) s'il n'y a qu'un seul document dans le répertoire
- soit ouvre une box pour laisser l'utilisateur le choix du fichier à ouvrir s'il y en à plusieurs.
- si le fichier était déjà ouvert (sans passer par la macro), je désire que excel capture le moment de sa fermeture ou de sa sauvegarde.
- si le fichier n'est pas ouvert, qu'on l'ouvre avec word (si c'est un word) et qu'on détecte sa fermette ou son enregistrement
- si il y a plein de fichier word d'ouvert, je veux uniquement avoir le contrôle sur le fichier qui m’intéresse.


Voilà, l'idée étant bien-sur de tout faire dans mon outil excel, sans avoir besoin de créer des macros dans chacun de mes autres documents que je désire ouvrir (word ou excel)

D'avance merci
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'567
Appréciations reçues : 215
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 24 juin 2016, 14:03

Bonjour,

Avant d'examiner plus spécifiquement ta demande, correction de ton code ci-dessous

module de classe MyWord
Option Explicit
Public WithEvents EvtsWord As Word.Application
Public WithEvents EvtsDoc As Word.Document
Private Sub EvtsWord_DocumentOpen(ByVal Doc As Word.Document)
    
    MsgBox "Document Word ouvert"

End Sub
Private Sub EvtsDoc_Close()
    
    MsgBox "Document Word fermé"

End Sub

Macro de base
Dim wd As Word.Application
Dim wdt As New MyWord
Sub test_ouverture_document()
    Dim nom_fichier As String
    
    'création instance application Word
    Set wd = CreateObject("Word.Application")
    'active les événements de l'application Word
      Set wdt.EvtsWord = wd.Application
    
    
    'ouverture fichier Word
     nom_fichier = "D:\document.docx"
      wd.Documents.Open Filename:=nom_fichier
    wd.Visible = True
    'active les événements du document actif
     Set wdt.EvtsDoc = wd.ActiveDocument
 
  
End Sub
Modifié en dernier par thev le 25 juin 2016, 00:40, modifié 2 fois.
Avatar du membre
thev
Membre impliqué
Membre impliqué
Messages : 2'567
Appréciations reçues : 215
Inscrit le : 13 juin 2016
Version d'Excel : 2019 FR 64 bits

Message par thev » 25 juin 2016, 00:37

voici un code qui devrait être conforme à ta demande

module de classe MyWord
Option Explicit
Public WithEvents EvtsWord As Word.Application
Public WithEvents EvtsDoc As Word.Document
Private Sub EvtsWord_DocumentOpen(ByVal Doc As Word.Document)
    
    MsgBox "Document Word avant ouverture"

End Sub
Private Sub EvtsDoc_Close()
    
    'désactive les événements du document actif
     Set EvtsDoc = Nothing
    MsgBox "Document Word avant fermeture"

End Sub
Private Sub EvtsWord_WindowActivate(ByVal Doc As Word.Document, ByVal Wn As Word.Window)
    
    'active les événements du document actif de l'instance word correspondante
     Set EvtsDoc = GetObject(Doc.Path & "\" & Doc.Name).Application.ActiveDocument
    
End Sub

module d'ouverture Document
Dim wd As Word.Application
Dim wdt As New MyWord
Sub ouvrir_doc(nom_doc)
    Dim nom_fichier As String
    
    'création ou récupération instance application Word
    On Error Resume Next
    Set wd = GetObject(, "Word.application")
    If Err.Number <> 0 Then Set wd = CreateObject("Word.Application")
    Err.Clear
    'active les événements de l'application Word
     Set wdt.EvtsWord = wd.Application

    'ouverture fichier Word
     wd.Documents.Open Filename:=nom_doc
    wd.Visible = True

  
End Sub
Votre Macro
Sub votre_macro()

    ' ajouter référence Microsoft Scripting Runtime
     Dim fso As New FileSystemObject
    Dim dossier As Folder
    Dim fichier As File
    Dim fd As Object
    Dim nom_dossier, ext_fichier As String
    Dim selection As Boolean
   
    'ouverture fichier Documents unique
     nom_dossier = "C:\Docs"
    Set dossier = fso.GetFolder(nom_dossier)
    For Each fichier In dossier.Files
        ext_fichier = fso.GetExtensionName(fichier.Path)
        If ext_fichier = "docx" Then Exit For
    Next
    If ext_fichier = "docx" And dossier.Files.Count = 1 Then
        Call ouvrir_doc(fichier.Path)
        Exit Sub
    End If
    
    'affichage fichiers à sélectionner
     Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .InitialFileName = nom_dossier
        .Filters.Add "Documents", "*.docx", 1
        .Title = "Sélectionner fichier(s) Documents"
        .AllowMultiSelect = True
        .InitialView = msoFileDialogViewDetails
        .ButtonName = "Sélection fichier(s) Documents"
        .Show
    End With
    
    'ouverture fichiers sélectionnés
     sélection = False
    For Each fichier In fd.SelectedItems
        sélection = True
        Call ouvrir_doc(fichier)
    Next
    If Not sélection Then
        MsgBox "Aucune sélection effectuée"
    End If


End Sub

s
sebien0077
Jeune membre
Jeune membre
Messages : 19
Inscrit le : 18 septembre 2014
Version d'Excel : 2013 FR

Message par sebien0077 » 25 juin 2016, 20:49

C'est pas mal du tout, mais pour une raison que j'ignore, les événements se déclenchent qu'à la première ouverture du fichier.
Essai d'ouvrir et fermer 2 fois de suite, la deuxième fois, aucune msgbox n’apparaît.
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message
  • Enregistrer Word
    par TeamG1 » 27 juin 2017, 11:15 » dans Excel - VBA
    5 Réponses
    460 Vues
    Dernier message par fred2406
    28 juin 2017, 11:48
  • Formulaire word
    par acymospc » 31 octobre 2014, 16:54 » dans Office
    1 Réponses
    966 Vues
    Dernier message par acymospc
    3 novembre 2014, 17:41
  • Date + 1 journée word
    par misk92 » 25 juillet 2018, 18:38 » dans Office
    3 Réponses
    3350 Vues
    Dernier message par TITOTO99
    13 février 2019, 08:18
  • Publipostage Excel > Word
    par Bisses » 13 septembre 2016, 12:40 » dans Excel - VBA
    9 Réponses
    1511 Vues
    Dernier message par patrick1957
    14 septembre 2016, 10:10
  • Excel vers Word
    par martin.truchon » 29 septembre 2016, 14:11 » dans Excel - VBA
    1 Réponses
    146 Vues
    Dernier message par Benead
    4 octobre 2016, 01:11
  • Word en PDF interactif
    par ser-fab » 28 avril 2018, 10:02 » dans Office
    1 Réponses
    2162 Vues
    Dernier message par Xmenpl
    23 juillet 2018, 10:54