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 :

Quitter une Userform


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2020
    Messages : 12
    Par défaut Quitter une Userform
    Bonjour, j'ai créé une UserForm pour enregistrer des joueurs.

    Elle affecte automatiquement un N° à chaque nouveau joueur et une série de label affiche au fur et à mesure la liste des inscrits.

    Problème : lorsque je sollicite le bouton quitter, le prg vba passe par initialize et revient sur l'userform.

    Suivant le nombre de joueurs inscrits, il me faut cliquer de nombreuses, très nombreuses fois sur quitter.

    Une solution à ce gros gros problème (pour moi)???

    A l'avance un grand merci

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Sans doute parce que tu ré-ouvres un nouvel UserForm à chaque saisie.

    Mais sans voir tes codes, impossible d'apporter une correction.

  3. #3
    Membre habitué
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2020
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mai 2020
    Messages : 12
    Par défaut
    Bonjour Menhir
    Il est évident qu'après chaque saisie, l'userform est de nouveau présentée pour un autre joueur.
    Ceci étant en cliquant sur "Quitter", l'ordre vba est simplement unload inscriptions. Mais le prg passe automatiquement à initialize de l'userform qui est de nouveau affichée
    Merci pour ta réponse

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Jurserg Voir le message
    Il est évident qu'après chaque saisie, l'userform est de nouveau présentée pour un autre joueur.
    La bonne pratique serait plutôt de vider le UserForm déjà ouvert pour le proposer vierge à une nouvelle saisie.

  5. #5
    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.

    il me semble parfaitement pertinent de vider le userform par Unload... Ca décharge le userform de la mémoire et donc, à l'utilisation suivante, il est "propre" pour une nouvelle utilisation, sans que tu doives écrire la macro qui le nettoiera. Mais forcément, tu (re)passeras par le Initialize puisque cet événement est appelé lors du chargement en mémoire.

    Que fait ton code lors de l'Initialize? S'il fait des choses que tu ne dois faire que lorsque tu l'ouvres "pour la première fois", tu pourrais te passer de Initialize et préparer ton userform entre le premier chargement et le Show.

    Voici un exemple minimaliste pour illustrer mon propos. Tu as un code dans Initialize qui place un texte sur le bandeau du userform. Il est évident que puisqu'il y a déchargement, tu vas repasser par Initialize à chaque pression sur le bouton. Tu auras donc, à chaque fois, le texte "Bonjour" sur le bandeau du userform.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub CommandButton1_Click()
      Unload Me
      UserForm1.Show
    End Sub
     
    Private Sub UserForm_Initialize()
      Me.Caption = "Bonjour"
    End Sub
    Voici le code qui appelle ce userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Test()
      UserForm1.Show
    End Sub
    Tu pourrais aussi réaliser la chose suivante: Déporter la modification du Caption dans le code qui appelle le useform et supprimer Initialize. Dès lors, tu auras le texte "Bonjour" sur le bandeau uniquement lors du premier appel, car l'initialisation de ton usf ne dépend plus de lui, mais du code qui l'appelle, et comme ton userform est déchargé puis rechargé lors d'un clic sur le bouton, il est "nettoyé" des saisies. Voici le code appelant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test()
      Load UserForm1
      With UserForm1
        .Caption = "Bonjour"
        .Show
      End With
    End Sub
    Perso, je ne suis pas friand de Initialize qui, de mon avis, ne sert jamais à grand chose et peut être remplacé par des lignes de code dans la procédure appelante. Ca permet plus de souplesse puisque Initialize n'accepte pas de paramètres. Soit les choses sont fixées dans le Initialize et dès lors, pourquoi ne pas les placer lors de la conception du usf, soit elles sont variables et doivent être placées dans le code d'appel comme je l'ai montré plus haut. Le seul attrait que je verrais à Initialize serait celui de valoriser des propriétés personnalisée, du USF par défaut, qu'elles soient publiques ou privées, chose qui n'est pas possible de réaliser au moment de la conception. Ces propriétés seraient alors modifiables après le Load (qui induit Initialize avant tout autre manipulation du usf) par le code appelant le usf, entre le Load et le Show ou durant la vie du userform.

    Je ne suis pas non plus trop friand d'un "réappel" par le userform lui-même. je préfère une boucle d'appel dans le code appelant avec une variable qui définit quand il faut s'arrêter. Voici le code du userform qui modélise cela, avec l'utilisation d'une propriété publique du userform (Result, déclarée en tête du module du userform) valorisée différemment selon que l'on ferme le userform par le bouton ou la croix de fermeture. Il faut noter que BeforeClose n'est appelé que lors du déchargement (par la croix ou par un Unload explicite).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Public Result As String
     
    Private Sub CommandButton1_Click()
      Result = "Validate"
      Me.Hide
    End Sub
    Le code d'appel est évidemment adapté pour réagir selon ton souhait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Test()
      Dim Result As String
     
      Load UserForm1
      UserForm1.Caption = "Bonjour"
      Do
        With UserForm1
          .Show
          Result = .Result
        End With
          Unload UserForm1
        Loop While Result = "Validate"
    End Sub
    Rappel des moments de vie d'un userform:
    1. Chargement en mémoire, levant l'évènement Initialize, qui est donc réalisé AVANT tout traitement par code externe, pour autant que cet évènement ait été codé;
    2. Préparation du userform avant son affichage;
    3. Affichage par la méthode .Show;
    4. Masquage par la méthode .Hide lors d'un clic que un bouton (Valider, Fermer, ...);
    5. Traitement des informations du userform;
    6. Déchargement du userform par Unload Usf.



    Il faut noter que le chargement en mémoire est implicite dès l'appel d'une méthode ou propriété du userform, ce qui rend l'utilisation de Load Usf inutile, sauf si tu souhaites un code limpide qui traduit la volonté du programmeur (Je passe donc toujours par un Load, personnellement). Tu retrouveras ces moments dans le code que j'ai fourni

    Si cela t'intéresse, j'ai écrit quelques billets sur les userforms
    "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...
    ---------------

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/04/2005, 17h52
  2. [C#] Quitter une application en mode console
    Par Ditch dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/04/2005, 21h37
  3. [FLASH MX] Quitter une animation flash
    Par lord enzo dans le forum Flash
    Réponses: 11
    Dernier message: 19/10/2004, 11h56
  4. Quitter une application
    Par fgrandjean dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/08/2004, 13h39
  5. Quitter une application FLASH ?
    Par jeje.r dans le forum Flash
    Réponses: 3
    Dernier message: 25/02/2003, 14h57

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