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 :

Détecter fermeture WORD dans EXCEL


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut Détecter fermeture WORD dans EXCEL
    Bonjour tout le monde,

    j'aurais besoin d'aide, voila mon problème :

    Le contexte :
    - un classeur excel d'ouvert
    - word d'ouvert
    Avec ma macros excel j'effectue des recherches dans le document word ouvert.

    Le probème est : si l'utilisateur ferme word ou le document word, j'aimerais que la macro excel le détecte, mais je ne sais comment faire.

    Avez vous des idées ?

    Merci par avance.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ce n'est pas un problème. Si Word est fermé, tu reviens dans Excel. Et si tu tentes de fermer Word dans Excel, tu as une erreur... Est-ce là ton problème ?

  3. #3
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Tu as donc créé une variable objet pour manipuler ton objet Word n'est-ce pas ?

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Une simple gestion d'erreur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Msgbox "Attendre fermeture de Word"
    'et si pas fermé...
    On error resume next
    DocWrd.close
    AppWrd.Quit
    On error goto 0
    Set DocWrd = Nothing
    Set AppWrd = Nothing
    'la suite de ta macro
    Mais j'attend avec impatience la solution de Maxence

    Edit
    Le msgbox est là afin d'empêcher la macro de fermer le doc word pendant que tu l'utilises.

  5. #5
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    ben, je pensais à un module de classe avec ce code dedans
    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
    Option Explicit
    Private WithEvents m_wdApp  As Word.Application
    Private m_IsLoaded          As Boolean
    Private Sub Class_Initialize()
        Set m_wdApp = New Word.Application
        m_wdApp.Visible = True
        m_wdApp.WindowState = wdWindowStateMinimize
    End Sub
    Private Sub m_wdApp_Quit()
        MsgBox "Word vient d'être fermé !"
        m_IsLoaded = False
    End Sub
    Function Application() As Word.Application
        Set Application = m_wdApp
        m_IsLoaded = True
    End Function
    Function isLoaded() As Boolean
        isLoaded = m_IsLoaded
    End Function
    et, pour tester ce que cela donne...
    Dans un module, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub toto()
        Dim x As MonWord
        Dim i As Long
        Set x = New MonWord
        MsgBox x.Application.Caption
        For i = 1 To 50000000
            DoEvents
            If Not x.isLoaded Then Exit For
            Debug.Print i
        Next
    End Sub
    La sub Toto lance une application Word (à travers la classe MonWord) et si on quitte Word à la main pendant que l'appli Excel tourne, cela interromp la procédure Excel...

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Qui parlait d'occupation de l'UC, tout à l'heure ?
    Pas très économique ta procédure... que j'attendais tant j'étais certain que c'était la solution que tu allais proposer.
    Il y en aurait pourtant une autre qui consisterait à vérifier si le process est toujours en vie, avec Windows... Mais ce coup-ci... c'est seulement un avis personnel...

  7. #7
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Qui parlait d'occupation de l'UC, tout à l'heure ?
    Pas très économique ta procédure...
    Certes !
    Certes !
    Mais, j'ai rarement fait une procédure de production qui s'appelle Toto également
    Il ne s'agit donc que d'une procédure de tests !
    Et, dans les tests, on fait du stress pour vérifier la réactivité.

    Donc, j'ai tout bon !
    ( la mauvaise foi personnifiée )

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut
    Merci à tous pour vos réponses


    @ Maxence HUBICHE

    J'ai essayé ton exemple mais il plante sur MonWord et sur isLoaded dans le module toto.
    je ne suis pas un expère des modules de classe.
    j'ai réalisé un copier collé de la premiere partie de l'exemple dans un module de classe est la deuxième dans un module
    Est ce que j'ai fait une connerie


    Par, ailleurs je travaille avec excel 2003 cela a peut être une importance
    merci par avance pour ton aide

  9. #9
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    il faut référencer la bibliothèque Word

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je trouve qu'il t'en faut bien des choses : Deux procédures, deux fonctions, une référence à valider...
    Par contre je remplacerais bien mon message
    Msgbox "Attendre fermeture de Word"
    par le tiens
    MsgBox "Word vient d'être fermé !"

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut
    Maxence HUBICHE

    j'ai bien activé la bibliothèque Word Microsoft WORD 11.0 object Library
    mais tjs le même résultat à la compile
    erreur type défini par l'utilisateur non défini

    j'ai encore besoin de ton d'aide



    ouskel'n'or

    Si tu as des idées n’hésite pas lâche toi …

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    As-tu testé mon code ?

    Edit
    Pour l'adapter, il nous faudrait le code d'ouverture (au moins le nom des variables)
    A+

  13. #13
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Citation Envoyé par RG25550 Voir le message
    Maxence HUBICHE

    j'ai bien activé la bibliothèque Word Microsoft WORD 11.0 object Library
    mais tjs le même résultat à la compile
    erreur type défini par l'utilisateur non défini

    j'ai encore besoin de ton d'aide

    En pas à pas {F8} sur quelle ligne obtiens-tu l'erreur ?

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut
    Maxence HUBICHE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub toto()
        Dim x As MonWord    ' <== ici 
        Dim i As Long
        Set x = New MonWord
        MsgBox x.Application.Caption
        For i = 1 To 50000000
            DoEvents
            If Not x.isLoaded Then Exit For
            Debug.Print i
        Next
    End Sub

  15. #15
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    La première partie du code est à Copier dans un module de classe.
    Il faut ensuite modifier la propriété (Name) du dit module de classe en la mettant à MonWord

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut
    Maxence HUBICHE

    OK cela ne plante plus et WORD s'ouvre

    mais si je ferme word pendant la boucle ci-dessous EXCEL est alerté
    mais c'est très long et cela ne fonctionne pas à tous les coups
    De plus si la boucle se termine cela ne fonctionne plus du tout.
    Cette boucle est-elle nécessaire. Elle semble utiliser toutes les ressource du système ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 1 To 50000000
            DoEvents
            If Not x.isLoaded Then Exit For
            Debug.Print i
        Next

  17. #17
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    La réponse a été donnée plus haut !
    Citation Envoyé par Maxence HUBICHE Voir le message
    Certes !
    Certes !
    Mais, j'ai rarement fait une procédure de production qui s'appelle Toto également
    Il ne s'agit donc que d'une procédure de tests !
    Et, dans les tests, on fait du stress pour vérifier la réactivité.

    Donc, j'ai tout bon !
    ( la mauvaise foi personnifiée )

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 9
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    As-tu testé mon code ?

    Edit
    Pour l'adapter, il nous faudrait le code d'ouverture (au moins le nom des variables)
    A+


    ouskel'n'or

    Excuse moi je ne comprends pas très bien avec le code que tu me proposes
    comment excel sera averti de la fermeture de WORD
    c'est sur ce point que je bute.
    Existerait-il pas une API ou autre méthode qui pourrait résoudre le pb
    pourrais-tu m'éclairer s'il te plait.

    Merci par avance

  19. #19
    Expert confirmé

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Bien sûr la méthode de Maxence HUBICHE est plus "sioux" mais elle occupe l'UC de manière "trés" importante.
    Mais non !
    C'est la boucle de tests qui occupe l'uc !
    Je mappe l'appli à une classe, et après, j'attends que l'évènement se produise pour l'intercepter.
    C'est de l'attente d'évènement, et rien d'autre !
    Il n'y a pas d'occupation de l'uC !

  20. #20
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Comment ouvres-tu Word ?
    Pour que mon code fonctionne, il doit être ouvert depuis Excel.
    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
    Sub OuvrirWord()
    Dim DocWrd As Variant 'le fichier word
    Dim AppWrd As Variant 'l'application
        Set AppWrd= CreateObject("Word.Application")
        DoEvents
        Set DocWrd= AppWrd.Documents.Open(Filename:="D:\Doc\LeDoc.doc")
        Application.DisplayAlerts = True
        AppWrd.ShowMe
        AppWrd.Visible = True
        '...
        'Ici le code pour travailler dans Word ou rien
        'puis, le code que je t'ai mis
        Msgbox "Attendre fermeture de Word"
        'et Word n'est pas fermé, un click sur Ok exécute les lignes suivantes
        On error resume next
            DocWrd.close
            AppWrd.Quit
        On error goto 0
        Set DocWrd = Nothing
        Set AppWrd = Nothing
        'la suite éventuelle de ta macro
    End Sub
    Tu peux quitter Word de deux manières, soit en fermant Word manuellement, soit en basculant sur Excel (barre des tâches)
    Si Word est fermé manuellement, tu as le message. Un click sur Ok (msgbox) et la macro Excel se poursuit.
    Si Word n'est pas fermé et que tu es retourné sur Excel (par la barre des tâches), le même Ok entraine l'exécution de la suite du code qui ferme Word avant que la macro se poursuive éventuellement (si tu as du code qui fait "autre chose" ensuite).
    Bien sûr la méthode de Maxence HUBICHE est plus "sioux" mais elle occupe l'UC de manière "trés" importante.
    Le fonctionnement aléatoire que tu observes aurait tendance à me le confirmer.

    Ceci dit, pour l'une ou l'autre méthode, tout dépend de la manière utilisée pour ouvrir Word. Si ce n'est pas par macro, tu dois en utiliser une troisième.
    Donc, tu nous dis
    A+

    Edit
    Tu as ici la méthode pour vérifier si une application (Windows) quelconque est ouverte. A adapter pour Word.
    A toutes fins utiles

    Citation Envoyé par Maxence HUBICHE
    C'est la boucle de tests qui occupe l'uc !
    C'est bien ce que je sous-entendais, on peut s'en passer, de la boucle ?

Discussions similaires

  1. [WD-2002] Cellules décalées si copie tableau word dans excel
    Par Boubas1 dans le forum Word
    Réponses: 1
    Dernier message: 11/04/2009, 00h25
  2. Récupération de données Word dans Excel en VBA
    Par infoexcel dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 14/01/2009, 10h01
  3. sauvegarde d'un fichier word dans excel
    Par buhrne dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/02/2008, 15h42
  4. Réponses: 2
    Dernier message: 13/04/2007, 11h46

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