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

  1. #1
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2019
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2019
    Messages : 125
    Points : 70
    Points
    70
    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
    12 771
    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 : 12 771
    Points : 28 631
    Points
    28 631
    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 régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2019
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2019
    Messages : 125
    Points : 70
    Points
    70
    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 379
    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 379
    Points : 12 075
    Points
    12 075
    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 379
    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 379
    Points : 12 075
    Points
    12 075
    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
    12 771
    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 : 12 771
    Points : 28 631
    Points
    28 631
    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 379
    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 379
    Points : 12 075
    Points
    12 075
    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

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 771
    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 : 12 771
    Points : 28 631
    Points
    28 631
    Billets dans le blog
    53
    Par défaut
    Bonjour Patrick,
    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)
    C'est bien pour cela que j'avais précisé "Je doute que ..." mais comme pour paraphraser Pierre Desproges 'Ma seule certitude c'est le doute", j'ai voulu effectuer un test rapide pour clore le sujet à ce propos.
    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

  9. #9
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    je pense avoir une solution pour la situation:

    1. ouverture de word
    2. blablabla
    3. réactivations de la fenetre Excel
    4. et par la réactivation de Excel fermer Word


    je vais faire des tests avec mon système de surveillance demandant très peu de ressource
    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

  10. #10
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 771
    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 : 12 771
    Points : 28 631
    Points
    28 631
    Billets dans le blog
    53
    Par défaut
    Bonjour Patrick,
    réactivations de la fenetre Excel
    Ce que le demandeur souhaite (si j'ai bien compris la question), ce n'est pas d'activer la fenêtre d'excel par VBA mais bien intercepter par VBA le retour manuel à Excel (le classeur qui a ouvert le document Word)
    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

  11. #11
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    ce test semble fonctionner
    dans le module thisworkbook
    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
    Private Declare Function GetActiveWindow Lib "user32" () As Long
    Public WithEvents Cmbrs As CommandBars
    Dim Hexcel As Long
    Dim Wapp As Object
    Dim Wdoc As Object
    Dim cel As Range
    Sub init()
        Set Cmbrs = Application.CommandBars
        Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled
    End Sub
    Private Sub Cmbrs_OnUpdate()
        Dim response
        Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled
        If GetActiveWindow = Hexcel Then
            Set Cmbrs = Nothing    'on arrete la surveillance en eliminant le map de la commandbars (le on_update ne sera plus declenché)
            'fermeture de word ici ou ce que tu veux
            response = MsgBox("voulez vous fermer word", vbYesNo, "excel a été réactivé")
            If response = vbYes Then Wdoc.Close: Wapp.Quit
            cel.Select
        End If
        Application.CommandBars.FindControl(ID:=2040).Enabled = True
    End Sub
    Sub test()
        Set cel = ActiveCell
        Hexcel = Application.Hwnd
        Set Wapp = CreateObject("Word.application")
        Wapp.Visible = True
        Set Wdoc = Wapp.documents.Open("C:\Users\polux\DeskTop\aaaaa.docx")
        Wapp.Activate
        Application.Wait (Now + TimeValue("0:00:02"))    'sur 2016 et 2013 c'est un peu plus long a ouvrir le word alors on met une attente
        init
    End Sub
    a tester dans un fichier vierge
    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

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re update version
    re
    version 2
    toujours pareil (le tout dans le module thisworkbook) et lancer la sub test
    version 32 bits uniquement
    pour le 64 adapter l'api
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    '------------------------------------------------------------------------------------
    '***********************************************************************************************
    'surveillance et fermeture de word  si réactivation manuelle de la fentre excel
    ' avec l'utilisation de l'astuce du map des commandbars et de l'evenement on_update de celles ci
    '***********************************************************************************************
    'auteur :patricktoulon
    'version date: 12/07/2019
    'update 14/07/2019: re nommage des subs et  séparation du start  et du stop surveillance  dans des subs respectives
    'cet exemple  instancie une instance de word et d'un document avec Wapp et Wdoc
    '***********************************************************************************************
    ' pour une eventuelle instance qui n'aurait pas été ouverte  par excel se servir de getobject
    'a fin de capter l'object application word et son document
    'de facon a pouvoir travailler sur sa fermeture (enregistrement/enregistrer sous ,etc...)
    '***********************************************************************************************
    '-------------------------------------------------------------------------------------
    Private Declare Function GetActiveWindow Lib "user32" () As Long
    Public WithEvents Cmbrs As CommandBars
    Dim Hexcel As Long 'handle de la fentre Application excel
    Dim Wapp As Object ' object application word
    Dim Wdoc As Object ' object word document
    Dim cel As Range
    '
    Sub SartSurveillance()
        Set Cmbrs = Application.CommandBars 'on map la commandbars
        Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled 'on change la valeur d'un control que l'on utilise presque jamais
    End Sub
    '
    Sub StopSurveillance()
        Set Cmbrs = Nothing    'on arrete la surveillance en eliminant le map de la commandbars (le on_update ne sera plus declenché)
        Application.CommandBars.FindControl(ID:=2040).Enabled = True
    End Sub
    '
    Private Sub Cmbrs_OnUpdate() 'evenement on update qui se declanche quand on modifie quelque chose dans les commandbars
        Dim response
         If GetActiveWindow = Hexcel Then ' si le handle actif est le handle de excel
            'fermeture de word ici ou ce que tu veux
            response = MsgBox("voulez vous fermer word", vbYesNo, "excel a été réactivé") 'demande de fermeture
            If response = vbYes Then Wdoc.Close: Wapp.Quit 'si oui on ferme word
            StopSurveillance 'si oui on stop la surveillance
            cel.Select 'pour réactiver le window du classeur
        End If
    Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled ' on rechange pour relancer le on update
       End Sub
    '
    'sub de test
    Sub test()
        Set cel = ActiveCell
        Hexcel = Application.Hwnd
        Set Wapp = CreateObject("Word.application")
        Wapp.Visible = True
        Set Wdoc = Wapp.documents.Open("C:\Users\polux\DeskTop\aaaaa.docx")
        Wapp.Activate
        Application.Wait (Now + TimeValue("0:00:02"))    'sur 2016 et 2013 c'est un peu plus long a ouvrir le word alors on met une attente
        SartSurveillance
    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

  13. #13
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2019
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2019
    Messages : 125
    Points : 70
    Points
    70
    Par défaut Fermer WORD depuis EXCEL
    Bonjour Philippe, Bonjour Patrick,
    merci à vous deux. Je suis admiratif.
    Au fait Patrick, ta dernière proposition est très intéressante. Seulement je suis en train de modifier le code (j'essaie) pour ne plus avoir recours au Message BOX. Ce que je voulais est de fermer Word automatiquement et immédiatement dès que je bascule sur Excel (autrement dit: dès que je retourne sur Excel avec la souris). Philippe a plutôt compris ce que je voulais exactement.
    Merci encore.

  14. #14
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2019
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2019
    Messages : 125
    Points : 70
    Points
    70
    Par défaut Fermer Word depuis Excel
    Salut à tous,
    j'ai développé quelque lignes de code qui me paraissent pas mal car elles correspondent à peu près à ce que je cherche:
    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
    Private Sub Worksheet_Activate()
     Dim WordApp As Object
       Dim WordDoc As Object
     
     
        Set WordApp = Word.Application
       'Set WordDoc = Word.Application.Documents
     
     
       ' WordDoc.Close
        WordApp.Quit
        'Set WordDoc = Nothing
        Set WordApp = Nothing
     
      End Sub
    Il y 2 problèmes:
    - ce code ne fonctionne qu'une fois sur deux: la 2ème fois je reçois un message "Erreur 462" "Le serveur distant n'existe pas ou n'est pas disponible". La 3ème fois ça marche, la 4ème non et ainsi de suite
    -d'autre part, ce que je cherchais à la base c'est de fermer Word au retour à Excel. Je l'ai testé avec "Worksheet_Activate" car je ne trouve pas la bonne méthode (Active_Window par exemple)

    Si je cherche tout cela au départ c'est par ce que quand j'ouvre Word une fois sans le fermer et que je souhaite retourner vers Word depuis Excel, il me demande d'ouvrir une copie du document, et je me retrouve avec plusieurs copie. C'est pour cela que j'ai envisagé de quitter Word à chaque fois (pour éviter cette galère de copies).

    Merci de votre aide

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    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 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    bonjour
    sérieux ?? tu sais pas comment enlever le msgbox dans ma version ??
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    '------------------------------------------------------------------------------------
    '***********************************************************************************************
    'surveillance et fermeture de word  si réactivation manuelle de la fentre excel
    ' avec l'utilisation de l'astuce du map des commandbars et de l'evenement on_update de celles ci
    '***********************************************************************************************
    'auteur :patricktoulon
    'version date: 12/07/2019
    'update 14/07/2019: separation du start  et du stop surveillance  dans des subs respectives
    'cet exemple  instancie une instance de word et d'un document avec Wapp et Wdoc
    '***********************************************************************************************
    ' pour une eventuelle instance qui n'aurait pas été ouverte  par excel se servir de getobject
    'a fin de capter l'object application word et son document
    'de facon a pouvoir travailler sur sa fermeture (enregistrement/enregistrer sous ,etc...)
    '***********************************************************************************************
    '-------------------------------------------------------------------------------------
    Private Declare Function GetActiveWindow Lib "user32" () As Long
    Public WithEvents Cmbrs As CommandBars
    Public Hexcel As Long  'handle de la fentre Application excel
    Public Wapp As Object ' object application word
    Public Wdoc As Object  ' object word document
    Public cel As Range
    '
    Sub SartSurveillance()
        Set Cmbrs = Application.CommandBars 'on map la commandbars
        Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled 'on change la valeur d'un control que l'on utilise presque jamais
    End Sub
    '
    Sub StopSurveillance()
        Set Cmbrs = Nothing    'on arrete la surveillance en eliminant le map de la commandbars (le on_update ne sera plus declenché)
        Application.CommandBars.FindControl(ID:=2040).Enabled = True
    End Sub
    '
    Private Sub Cmbrs_OnUpdate() 'evenement on update qui se declanche quand on modifie quelque chose dans les commandbars
        Dim response
         If GetActiveWindow = Hexcel Then ' si le handle actif est le handle de excel
            'fermeture de word ici ou ce que tu veux
            Wapp.DisplayAlerts = False
            Wdoc.Close: Wapp.Quit 'si oui on ferme word
            StopSurveillance 'si oui on stop la surveillance
            cel.Select 'pour réactiver le window du classeur
        End If
    Application.CommandBars.FindControl(ID:=2040).Enabled = Not Application.CommandBars.FindControl(ID:=2040).Enabled ' on rechange pour relancer le on update
       End Sub
    '
    'sub de test
    Sub test()
        Set cel = ActiveCell
        Hexcel = Application.Hwnd
        Set Wapp = CreateObject("Word.application")
        Wapp.Visible = True
        Set Wdoc = Wapp.documents.Open("C:\Users\polux\DeskTop\aaaaa.docx")
        Wapp.Activate
        Application.Wait (Now + TimeValue("0:00:02"))    'sur 2016 et 2013 c'est un peu plus long a ouvrir le word alors on met une attente
        SartSurveillance
    End Sub
    et voila ca ferme word brutalement quand tu touche avec la souris un endroit de la fenêtre de excel

    ps: moi aussi j'avais compris ,si j'ai mis un msgbox c'est pour te permettre au cas ou: de mettre deux lignes de code pour enregistrer le word
    bon maintenant il est fermé sans enregistrer

    edit 2:
    Si je cherche tout cela au départ c'est par ce que quand j'ouvre Word une fois sans le fermer et que je souhaite retourner vers Word depuis Excel, il me demande d'ouvrir une copie du document, et je me retrouve avec plusieurs copie. C'est pour cela que j'ai envisagé de quitter Word à chaque fois (pour éviter cette galère de copies).
    ma fois et ce que tu a fait sur word alors c'est perdu?????
    la condition sur le msgbox n'était pas la pour 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

  16. #16
    Membre régulier
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2019
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2019
    Messages : 125
    Points : 70
    Points
    70
    Par défaut Fermer Word depuis Excel
    Salut Patrick,
    c'est résolu. Merci pour l'intérêt que tu a porté à mes questions. Bravo! Je suis admiratif. Philippe,Merci à toi aussi.

+ 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