IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Fermer WORD via VBA EXCEL


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2019
    Messages : 151
    Par défaut Fermer WORD via VBA EXCEL
    Salut à tous,
    L'idée est d'ouvrir un document WORD depuis Excel et le fermer automatiquement dès que je retourne à EXCEL;
    Je parviens à l'ouvrir avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Option Explicit
     
     
     Sub Vers_Word()
     
    Dim NDF As String
    Dim WordApp As Word.Application
    Dim WordDoc As Word.Document
        NDF = "C:\Users\dell\Desktop" & "\XXXXXXXX.docm"
        On Error Resume Next
         Set WordDoc = WordApp.Documents("VBA_Etoile-Triangle_mode_d'emploi_.docm")
        Set WordApp = CreateObject("Word.Application")
     
        Set WordDoc = WordApp.Documents.Open("C:\Users\dell\Desktop\XXXXXXXXXXX.docm", ReadOnly:=False)
        WordApp.Visible = True
        'If WordApp.Visible = False Or ActiveSheet.Activate = True Then
        'Application.OnTime Now + TimeValue("00:00:3"), "sortir_word"
        'End If
       ' Application.OnTime Now + TimeValue("00:00:4"), "feuille_active"
     
            End Sub
    Le document s'ouvre avec succès, par contre je ne parviens pas à le fermer ni depuis Excel ni autre. Finalement, pour m'assurer que le est visible depuis EXCEL j'ai créer un module avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Sub verifier_si_WordOuvert()
       Dim Appli As Word.Application
       Dim WordDoc As Word.Document
     
     
        On Error Resume Next
        Set Appli = GetObject("Word.Application")
        Set WordDoc = Appli.Documents("C:\Users\dell\Desktop\XXXXXXX.docm")
        On Error GoTo 0
        If WordDoc Is Nothing Then
            MsgBox "Le document est fermé"
            ElseIf Not WordDoc Is Nothing Then
            MsgBox "Le document est ouvert"
        End If
    End Sub
    Je reçois toujours le message "Le document est fermé" malgré que le document est ouvert. J'en ai déduit que le document en question n'est pas le bon bien que c'est le même. J'ai modifié le nom plusieurs fois. Sans succès. Avez-vous une solution pour moi, svp ?

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Un exemple de procédure qui ouvre un nouveau document Word basé sur un modèle nommé myTemplate.docx se trouvant dans un sous-répertoire nommé Template et que l'on ferme si l'on répond Oui lors de l'affichage du MsgBox
    En enlevant l'apostrophe de la ligne 25 (le document Word s'affiche et masque Excel et donc le MSgBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Sub WordOpenDoc()
      ' Exemple de l'ouverture d'un document word basé sur un document (docx) servant de modèle
      '   Le modèle doit se trouver dans un sous-répertoire de l'application nommée Template
      '
      ' >>> Nécessite d'activer la reference Microsoft word xx.x 0bject Library <<<
      '
      ' Philippe Tulliez (www.magicoffice.be)
      '    Formation VBA pour Excel
      '
      ' Déclaration des constantes et variables
      Const SubFolder As String = "\Template\"         ' Sous répertoire des modèles
      Const TemplateName As String = "myTemplate.docx" ' Nom du document servant de modèle
      Dim aWrd As Word.Application  ' Application Word
      Dim wDoc As Word.Document     ' Document Word
      Dim aFolder As String         ' Répertoire de l'application
      Dim FullName As String        ' Nom complet du modèle (Répertoires + Nom)
      ' Affectation des valeurs & Attribution des références d'objet aux variables
      aFolder = ThisWorkbook.Path   ' Répertoire où se trouve ce classeur (l'application)
      FullName = aFolder & SubFolder & TemplateName
      Set aWrd = New Word.Application
      Set wDoc = aWrd.Documents.Add(Template:=FullName)
      '
      With aWrd
      .Visible = True  ' Affiche l'application
      ' .Activate      ' (Excel est caché)
      End With
      If MsgBox("Voulez-vous fermer le document " & wDoc.Name, vbYesNo + vbDefaultButton2) = vbYes Then
         On Error Resume Next ' Pour éviter le message d'erreur en cas de fermeture manuelle
         MsgBox "Je ferme " & wDoc.Name
         wDoc.Close
         On Error GoTo 0
      End If
      ' Fin
      Set aWrd = Nothing: Set wDoc = Nothing
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2019
    Messages : 151
    Par défaut Fermer WORD depuis EXCEL
    Bonjour,
    d'abord je vous remercie de votre réponse.
    En vérité, je cherche à fermer un document WORD (.docx ou .docm) depuis EXCEL. L'idéal serait de le fermer automatiquement dès que je retourne au classeur EXCEL.
    J'ai essayé avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_Activate()
    WordDoc.Close
    WordApp.Quit
    End Sub
    mais le problème est que WordApp n'est pas reconnu (Variable ou Bloc with non définie) même quand je le déclare comme "Public" ou que je le déclare dans "Thisworkbook":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Private Sub Worksheet_Activate()
    WordDoc.Close
    ThisWorkbook.WordApp.Quit
    End Sub
    Merci encore

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bonjour
    perso j'ai une douleur persistante dans les yeux au regard de ce départ de code ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim WordApp As Word.Application'earlybinding (reference activée)
    Dim WordDoc As Word.Document
        NDF = "C:\Users\dell\Desktop" & "\XXXXXXXX.docm"
        On Error Resume Next
         Set WordDoc = WordApp.Documents("VBA_Etoile-Triangle_mode_d'emploi_.docm")
        Set WordApp = CreateObject("Word.Application")'latebinding (pas besoins d'activer la reference)
     
        Set WordDoc = WordApp.Documents.Open("C:\Users\dell\Desktop\XXXXXXXXXXX.docm", ReadOnly:=False)
        WordApp.Visible = True
    alors tantôt early binding tantôt latebinding (il faut choisir )

    ensuite

    ta variable WordApp est instanciée donc 2 fois ce qui fait que la première est perdu dans les méandres des taches et donc inaccessible par VBA excel puisque c'est devenu la 2d instance créée en latebinding

    pour faire court c'est pareil pour WordDoc tantôt c'est le "VBA_etoile...." tantôt c'est le "...XXXXX...docm"

    il est tout a fait normal que tu t y perde au niveau des acces

    je ne parle même pas de ce pseudo test (du moins je crois que c'est ce que tu veux faire)
    si ton intention était de tester si le fichier était ouvert tu peux oublier
    car l'instance de WordApp n'est pas celle contenant la cession du fichier si tant est qu'il soit ouvert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    On Error Resume Next
         Set WordDoc = WordApp.Documents("VBA_Etoile-Triangle_mode_d'emploi_.docm")
        Set WordApp = CreateObject("Word.Application")'latebinding (pas besoins d'activer la reference)
    et le must c'est le on error resume next qui par voie de conséquence va forcement passer a la creation en latebinding en raison du pseudo test cité précédemment qui donnera toujours faux

    conclusion:
    pour commencer

    1. tu veux tester si un fichier est ouvert mais pas par excel c'est getobject(.....)
    2. tu veux créer une instance de word choisi d'abords la méthode late/early binding
    3. les on error ... tu oublie il te masque les raisons des éventuelles erreurs mais ne solutionnent rien
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    une petite ébauche de fonction qui pourrait t'être utile

    la fonction renvoie true ou false selon si le fichier est ouvert
    et 2 variables object (Wdapp,Wdoc) en callback (object application et object document )pour manipuler l'instance ou le document

    dans la sub test le else servirait a la création d'une instance et l'ouverture et/ou création de document


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function IsOpen(fichier, Wdapp, wdoc) As Boolean
        On Error Resume Next
        Set wordAppOut = GetObject(, "Word.Application")
        Err.Clear
        If Not wordAppOut Is Nothing Then
            For Each d In wordAppOut.documents
                If d.Name = Mid(fichier, InStrRev(fichier, "\") + 1) Then
                    IsOpen = True
                    Set Wdapp = wordAppOut
                    Set wdoc = d
                End If
            Next
        End If
    End Function
    la sub pour tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub testx()
        Dim Wdapp As Object, wdoc As Object
        x = IsOpen("C:\Users\polux\DeskTop\aaaaa.docx", Wdapp, wdoc)'adapter le chemin 
        If x = True Then
            t = "le fichier """ & wdoc.Name & """ est bien ouvert" & vbCrLf & vbCrLf
            t = t & " vous pouvez utiliser la variable (Wdapp) qui est de type """ & Wdapp.Name & ".Application""" & " pour travailler avec cette instance de l'application " & vbCrLf & vbCrLf
            t = t & " vous pouvez utiliser la variable wdoc qui est de type " & Wdapp.Name & TypeName(wdoc) & " pour travailler sur le document "
            MsgBox t
        Else
            MsgBox "fichier non ouvert"
            ' faire se qu'on veut  si le fichier n'est pas ouvert dans le else
        End If
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    d'abord je vous remercie de votre réponse.
    En vérité, je cherche à fermer un document WORD (.docx ou .docm) depuis EXCEL. L'idéal serait de le fermer automatiquement dès que je retourne au classeur EXCEL.
    Dans ce cas, il faudra fermer le document en détectant le changement de fenêtre par une procédure événementielle mais comme on a ouvert une autre application, je ne suis pas certain que la procédure Workbook_WindowActivate puisse servir (à tester, je n'ai pas d'expérience sur ce sujet)
    Personnellement et suivant le scénario soit je sauve et je ferme le document immédiatement soit je le ferme à la fermeture de ThisWorkbook. Chacun ses habitudes

    mais le problème est que WordApp n'est pas reconnu (Variable ou Bloc with non définie) même quand je le déclare comme "Public" ou que je le déclare dans "Thisworkbook":
    Bien que dans mes applications j'utilise toujours le Late Binding, J'ai opté pour le "early binding" pour l'exemple et j'ai bien indiqué dans le commentaire ' >>> Nécessite d'activer la reference Microsoft word xx.x 0bject Library <<<

    Je teste toutes les procédures que je publie.
    Je peux donc te confirmer que cela fonctionne chez moi dans les conditions décrites dans mes explications.

    [EDIT]
    Je viens de tester et je confirme que la procédure événementielle Workbook_WindowActivate ne détecte pas le changement de fenêtre lorsque l'on reviens sur excel après avoir été sur une fenêtre de l'application Word
    Il doit certainement avoir un événement existant pour ce cas précis (API ou Public WithEvents ? ) mais je l'ignore pour l'instant.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour philippe
    Je viens de tester et je confirme que la procédure événementielle Workbook_WindowActivate ne détecte pas le changement de fenêtre lorsque l'on reviens sur excel après avoir été sur une fenêtre de l'application Word
    Il doit certainement avoir un événement existant pour ce cas précis mais je l'ignore pour l'instant
    c'est le St grall ca tu n'est pas le seul a désirer gérer l'évènement fenêtre

    l'evenement Workbook_WindowActivate ne fonctionne qu'entre workbook dans l'application et c'est normal puisque c'est de la(des) (Windows classeur dans l'application) qu'il s'agit et non de la fenêtre(window application)
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ouvrir et fermer un document Powerpoint via VBA Excel
    Par Spaaara dans le forum VBA PowerPoint
    Réponses: 0
    Dernier message: 12/04/2018, 09h46
  2. D'Excel vers Word via VBA
    Par Juunii dans le forum VBA Project
    Réponses: 17
    Dernier message: 25/05/2015, 20h47
  3. [XL-2010] Extraction données formulaire Word via VBA Excel
    Par jojoSuperFripouille dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/04/2013, 17h18
  4. manipuler word via vba excel
    Par Patnel dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/02/2011, 11h06
  5. Insérer un Tableau excel dans Word via VBA depuis Excel
    Par Godzestla dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 14/05/2008, 08h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo