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 :

Msgbox - détecter sa fermeture par clic sur croix [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 645
    Par défaut Msgbox - détecter sa fermeture par clic sur croix
    Bonjour,

    Tout est dans l'intitulé.
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Tuto_Click()
     
        MsgBox "Merci à Zaza pour cette présentation !", vbInformation, ""
     
        On Error GoTo suite
     
        ThisWorkbook.FollowHyperlink "S:\blabla Tuto.mkv"
        Exit Sub
    suite:
        MsgBox "Le support a été déplacé ou supprimé !", vbCritical, "Alerte"
    End Sub
    Problème : si l'utilisateur clic sur la "petite croix" en haut à droite du Msgbox, le code est exécuté !
    La seule chose que j'ai trouvé, c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
      MsgBox "Bye ! " & CloseMode
    End Sub
    ... (apparemment) ça ne fonctionne que sur 1 UF

    Question : Est-il possible de détecter la fermeture d'1 Msgbox ?

    En vous remerciant par avance pour vos lumières,
    Cordialement,
    jp

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 562
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub CommandButton1_Click()
    If MsgBox("test", vbYesNo + vbInformation, "titre") = vbYes Then
          Unload Me
    End If
    End Sub
     
     
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
      MsgBox "Bye ! " & Array("Part le X du UserForm", "Par la fonction Unload Me")(Abs(CloseMode))
      Cancel = Not Cbool(CloseMode)
    End Sub

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 199
    Par défaut
    hello,
    appuyer sur la croix d'un msgBox est équivalent à appuyer sur le bouton Cancel de la boîte de dialogue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub testMsgBox() 
      rep = MsgBox("Merci à Zaza pour cette présentation !", vbInformation + vbOKCancel, "")
     
        On Error GoTo suite
        Select Case rep
        Case vbYes: Debug.Print "OK"
        Case vbCancel: Debug.Print "Cancel"
        End Select
     
        Exit Sub
    suite:
        MsgBox "Le support a été déplacé ou supprimé !", vbCritical, "Alerte"
    End Sub
    Ami calmant, J.P

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 645
    Par défaut
    Bonjour et merci pour vos réponses,

    Désolé, je n'ai pas compris.
    La variable rep doit-elle être différente suivant que je clique sur OK ou sur la petite croix ?
    En exécutant le code pas à pas, dans les deux cas, rep = 1

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 199
    Par défaut
    hello,
    Citation Envoyé par jpma75 Voir le message
    Bonjour et merci pour vos réponses,

    Désolé, je n'ai pas compris.
    La variable rep doit-elle être différente suivant que je clique sur OK ou sur la petite croix ?
    En exécutant le code pas à pas, dans les deux cas, rep = 1
    pour que cela fonctionne il faut qu'il y ait le bouton Cancel dans le msgbox ( avec vbOKCancel)

    Ami calmant, J.P

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 645
    Par défaut
    @ Thumb down
    Private Sub CommandButton1_Click()
    Il ne s'agit pas d'un bouton de commande mais d'un msgbox "simple" avec bouton OK uniquement

    If MsgBox("test", vbYesNo + vbInformation, "titre") = vbYes Then

  7. #7
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 562
    Par défaut
    Citation Envoyé par jpma75 Voir le message
    @ Thumb down


    Il ne s'agit pas d'un bouton de commande mais d'un msgbox "simple" avec bouton OK uniquement
    et je le teste commentnton msgbox?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    msgbox "Le msggbox supent l’exécution du code, donc il suffit d’attendre le click sur OK !"
    msgbox "OK"
    le msgbox ne gère pas le click sur la croix!

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 645
    Par défaut
    @ l'ami calmant jp

    pour que cela fonctionne il faut qu'il y ait le bouton Cancel dans le msgbox (avec vbOKCancel)
    Avec vbOKCancel je comprends ta solution.

    Merci et désolé pour ma réponse tardive,

    Cdt
    l'ami calmé jp

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut

    Citation Envoyé par jurassic pork Voir le message
    [...]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub testMsgBox() 
      rep = MsgBox("Merci à Zaza pour cette présentation !", vbInformation + vbOKCancel, "")
     
        On Error GoTo suite
        Select Case rep
        Case vbYes: Debug.Print "OK"
        Case vbCancel: Debug.Print "Cancel"
        End Select
     
        Exit Sub
    suite:
        MsgBox "Le support a été déplacé ou supprimé !", vbCritical, "Alerte"
    End Sub
    Ami calmant, J.P
    Avec vbinformation + vbokcancel, rep ne vaudra jamais vbYes ^^. Le code qui suit le On Error ne saura jamais planter, puisque la seule ligne de code qui pourra être éventuellement exécutée est le Debug.Print.Cancel. Ca ne lèvera jamais une erreur, ça. Du coup, le msgbox "Le support a été déplacé..." ne sera jamais exécuté non plus. Ca veut dire que la seule ligne qui sera à coup sûr exécutée est rep = msgbox(...), et celle qui sera éventuellement exécutée est Debug.Print "Cancel"...Je ne comprends donc pas bien l'exemple

    De plus, rep n'est pas déclaré, donc le code ne sait pas être testé dans le cadre d'une utilisation des bonnes pratiques qui veulent que l'on force la déclaration des variables.


    Perso, je me passe du on error, du case et surtout du exit sub... Beerk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Test()
      Dim Result As VbMsgBoxResult
     
      Result = MsgBox("Merci pour cette présentation", vbInformation + vbOKCancel)
      If Result = vbOK Then
        MsgBox "vous avez cliqué ok"
      Else
        MsgBox "vous avez cliqué sur Cancel ou la croix"
      End If
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    [...]
    le msgbox ne gère pas le click sur la croix!
    Si, selon la configuration des boutons.

    Les boutons vbYesNo ne donnent pas accès à la croix, mais vbOkCancel, vbYesNoCancel, vbRetryCancel y donnent accès et gère vbCancel (constante de valeur 2) en réponse. vbOk seul donne accès à la croix mais ne la gère pas puisqu'il n'y a pas de choix clairement posé. Tout cela est assez logique, en fait.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 645
    Par défaut
    Bonjour Pierre,

    Merci pour cette (ces) précision(s) !

    J'avais répondu ceci à Alain :
    Avec vbOKCancel je comprends ta solution.
    Peut-être aurais-je dû dire "je comprends le principe" - car j'avais adapté le code comme tu viens de le proposer

    ... et je me suis même risqué à la simplification suivante qui fonctionne manifestement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Tuto_Film_Click()
    Dim rep As Byte
     
        Unload Menu_Adm
        rep = MsgBox("Merci à zaza pour cette présentation !", vbOKCancel + vbInformation, "")
     
        On Error Resume Next
        If rep = 2 Then Exit Sub
     
        MsgBox "Le support a été déplacé ou supprimé !", vbCritical, "Alerte"
    End Sub

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Bonsoir JP


    Comme dit dans ma précédente intervention et comme expliqué dans le billet cité, je n'aime pas les Exit Sub... La proc dessous réalise le même travail, mais sans Exit Sub. Au passage, je ne vois pas d'utilité au On Error Resume Next dans ton code . Et tant qu'à faire, je préfère utiliser les constantes comme vbOk, vbCancel ou vbYes plutôt que leurs valeurs numériques comme 1, 2 ou 6. C'est directement compréhensible à la lecture du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Tuto_Film_Click()
      Dim rep As Byte
     
      Unload Menu_Adm
      rep = MsgBox("Merci à zaza pour cette présentation !", vbOKCancel + vbInformation, "")
      If rep = vbOK Then MsgBox "Le support a été déplacé ou supprimé !", vbCritical, "Alerte"
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 645
    Par défaut
    Bonsoir Pierre,

    Désolé,

    Avant de lire ton dernier message, je venais tout juste de voir (et donc de lire) ton billet sur le "bannissement" d'Exit Sub. Je prends acte !! Merci !
    Je me doutais que ma prétendue "simplification" était encore truffée de coquilles.

    Cela fait pour moi écho à notre dernier échange "Boucle sur Label" et à l'usage que je faisais de la syntaxe [a1]

    Tu avais dit :
    Dans mon billet, j'ai expliqué pourquoi j'étais contre cette pratique. Ca s'arrête là. Ce n'est pas moi qui maintient ce code, donc je me borne à défendre ce qui pour moi sont des bonnes pratiques et à fustiger ce qui pour moi sont des mauvaises pratiques, mais après, chacun code comme il l'entend, tant que je n'ai pas à repasser sur le code...
    Echo ? Je m'explique. En fait, ta remarque m'a fait gamberger : (pour résumer) A partir de quand, peut-on être assuré qu'on a une bonne pratique ? Ne sait-on pas qu'elle est bonne quand on a identifié que la précédente était mauvaise ?

    Le problème, c'est que par chance, sans doute, il se trouve qu'un code imparfait peut vivre avec ses tares dès lors que rien ne les révèlent... Mes "applications" sont généralement à destination d'autrui. Autant dire que j'aspire fébrilement à ce qu'elles soient fiables et stables et que j'y mets toute l'énergie possible. Mais je me dis que si quelqu'un comme toi (...) lisait mon code, il me donnerait des frayeurs a posteriori mais pour la bonne cause !!! Et le paradoxe, c'est que je ne me vois pas poster du code qui fonctionne manifestement, juste pour le faire valider par le forum. Donc, je suis condamné à guetter ça et là et au détour d'un sujet lambda, ce qui peut corriger les mauvaises pratiques que j'adopte à "l'insu de mon plein gré"

    Bien que ceci soit une maigre consolation, je dois dire qu'il y a une certaine délectation à relire un vieux code et à pouvoir modestement l'optimiser.

    T'est-il déjà arrivé d'avoir (au moins) une mauvaise pratique ?

    (je voulais épargner le forum de mes états d'âme, c'est raté)

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

Discussions similaires

  1. [WD25] Executer par programmation clic sur croix (Onglet dynamique)
    Par mous97 dans le forum WinDev
    Réponses: 1
    Dernier message: 29/01/2021, 12h26
  2. Réponses: 8
    Dernier message: 09/05/2007, 00h35
  3. [MySQL] Affichage auto de champs par clic sur liste déroulante
    Par Mister Shell dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/12/2006, 12h08
  4. Tri par clic sur étiquettes
    Par Kloun dans le forum Access
    Réponses: 4
    Dernier message: 03/02/2006, 08h32
  5. charger nouvelle page par clic sur bouton (pas pop-up)
    Par michaelbob dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/09/2005, 16h04

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