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 :

Reset de variables [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 41
    Points : 28
    Points
    28
    Par défaut Reset de variables
    Bonjour, c'est mon premier post sur ce forum.

    J'ai commencé un projet en excel via les macro et vba, et je rencontre un petit souci (de débutant j'imagine) que je n'arrive pas à résoudre malgré mes recherches.

    Pour essayer d'expliquer simplement mon problème, j'ai 2 userforms, qui contiennent chacun un formulaire et un bouton. Au clic du premier bouton (du premier formulaire), le deuxième formulaire s'ouvre, et les champs complétés sont récupérés. Au clic du deuxième bouton (du second formulaire), les informations sont écrites dans un word.

    A la première utilisation, ça fonctionne. Mais dès qu'il y a plusieurs encodages successifs, les champs du deuxième formulaire, reprennent les informations de l'encodage précédent (et non ceux qui viennent d'etre resoumis dans le formulaire 1)

    userform1: formulaire avec date nom prénom et bouton1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub UserForm_Initialize()
    	Préremplissage tbdate
    End Sub
    Private Sub bt1_Click()
    	UserForm2.Show
    End Sub
    userform2: formulaire qui récupère les variables renseignées au formulaire 1, avec d'autres champs complémentaires à compléter, et un bouton2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private sub userform_initialize()
    Tbnom = Userform1.tbnom
    End Sub
    Private sub bt2_click()
    ‘Ouvre un document word
    End Sub
    J'ai essayé de réinitialiser les variables, soit en leur attribuant une valeur "" soit vbnullstring , mais ce problème persiste.
    Pour l'instant à l'usage, quand ça se produit, je ferme le formulaire2, et en cliquant à nouveau sur le bouton1, le formulaire2 reprendra enfin les bonnes valeurs.

    Une petite lumière pour m'éclairer?

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    J'ai essayé de réinitialiser les variables, soit en leur attribuant une valeur "" soit vbnullstring , mais ce problème persiste.
    Pourquoi n'avoir mis aucune ligne concernant cette initialisation du 2nd UF qu'on puisse dire ce qu'on en pense ???

    Fait ton initialisation dans .Activate qui sera appelé à chaque .Show
    Ou un .Close à la place d'un .Hide.
    Mais comme tu ne montres rien... Tout ce qu'on voit c'est que tu l'affiches
    eric

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Euh oui ok, voilà comment c'est à présent

    UserForm1: formulaire avec date nom prénom et bouton1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub UserForm_Initialize()
    	tbdate = Month(Now)
    End Sub
    Private Sub bt1_Click()
    	UserForm2.Show
    End Sub
    UserForm2: formulaire qui récupère les variables renseignées au formulaire 1, avec d'autres champs complémentaires à compléter, et un bouton2
    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
    Private sub userform_initialize()
    tb_nom = Userform1.tbnom
    tb_prenom = Userform1.tbprenom
    tb_date = Userform1.tbdate
    tb_heure = Userform1.tbheure
    tb_email = Userform1.tbemail
    End Sub
    Private sub bt2_click()
    ' ouverture d'un doc word vierge, le compléter, l'enregistrer, fermer le document et word toute cette partie fonctionne    
        'Réinitialisation des champs du formulaire
        tb_date = ""
        tb_heure = ""
        tb_mail = ""
        tb_nom = ""
        tb_prenom = ""
     
        'j'ai essayé de rappeler: Call UserForm_Initialize
        Unload Me
    End Sub
    Je ne sais pas si c'est suffisant pour comprendre d'ou viendrait le souci :/

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Il est où ce userform_initialize pour le 2nd ?
    Sûrement pas à sa place pour être en minuscule, c'est anormal.
    Double-clique dans une zone vide de UF2 et choisi l'événement dans la liste déroulante en haut à droite.
    Et essaie de mettre dans UserForm_Activate plutôt que UserForm_Initialize, il y a d'autres façons de le fermer que le seul endroit où tu as mis .Close
    eric

  5. #5
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour, essayez donc mon code ci-dessous. Une fois Word terminé, on ferme UF2 et on le vide! vous apparait UF1 et lorsque vous aurez fini la nouvelle saisie, le bouton de UF1 redémarrera UF2 avec les nouvelles valeurs de UF1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private sub userform_initialize()
    tb_nom = Userform1.tbnom
    tb_prenom = Userform1.tbprenom
    tb_date = Userform1.tbdate
    tb_heure = Userform1.tbheure
    tb_email = Userform1.tbemail
    End Sub
    Private sub bt2_click()
    ' ouverture d'un doc word vierge, le compléter, l'enregistrer, fermer le document et word toute cette partie fonctionne    
       'fermeture et remise à zéro du UF2
    UserForm2.hide
    Unload UserForm2
    End Sub
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Points : 350
    Points
    350
    Par défaut
    Bonjour

    Supprime la ligne 18 (Unload Me) du second formulaire. Cependant tu ne videras que les 5 objets cités, pas les autres. Pour ceux-ci, il te faudra allonger la liste et si tu en as 36, …*

    Je pars du principe que pour avoir une bonne vision des choses, mes contrôles sont présentés par leur étiquette (Label). Dans ce cas, je les renomme en les numérotant (C1 , C2 , C3, …) cela permet en plus de simplifier les programmations. D’ailleurs, ces numéros peuvent correspondre aux numéros des colonnes des cellules associées.

    Dans le premier formulaire UsF1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub UserForm_Initialize()
        C1 = Month(Now)
    End Sub
    Private Sub Cb_click() 'bouton
        Me.Hide         ‘attention, pas Unload Me !
        UsF2.Show
    End Sub
    Dans le second UsF2 (ici 9 contrôles à initialiser)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim n As Byte
    Private Sub UserForm_Initialize()
      For n = 1 To 5: Me("C" & n) = UsF1.Controls("C" & n): Next5 numéros identiques  aux originaux
    End Sub
    Private Sub Cb_click()
        MsgBox "Je vais l'ouvrir !", , "Tu me le demandes ..."
        'Réinitialisation des champs du formulaire
        For n = 1 To 9: Me("C" & n) = "": Next                            ‘les 5 et les autres
    End Sub
    Remarques

    - j’ai présenté le cas du masquage du premier formulaire (Me.Hide). On pourrait vouloir le fermer totalement (Unload Me) mais dans ce cas, il faudra d’abord transmettre les informations et pour cela, on passera plutôt par,
    Dans le premier formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim n As Byte
    Private Sub UserForm_Initialize()
        C1 = Month(Now)
    End Sub
    Private Sub Cb_click() 'bouton
        For n = 1 To 5: UsF2.Controls("C" & n) = Me("C" & n): Next
        Unload Me
        UsF2.Show
    End Sub
    Dans le second UsF2 (ici 24 contrôles à initialiser)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim n As Byte
    Private Sub Cb_click()
        MsgBox "Je vais l'ouvrir !", , "Tu me le demandes ..."
        'Réinitialisation des champs du formulaire
        For n = 1 To 24: Me("C" & n) = "": Next                          ‘les 5 et les autres
    End Sub
    - On peut remplacer sans problème le U de Userform_Initialize … par un u. Tous les autres seront corrigés ainsi.

    - Je n’inclus pas un bouton pour quitter, il y a déjà un qui sert à cela (x). Par contre, il sera nécessaire si le bandeau bleu du formulaire est caché !

    *De Pierre Dac (humoriste mais plein de bon sens) :
    « Si les points de suspension pouvaient parler, ils pourraient en dire des choses et des choses ! »

    Edit : salut Transitoire (je n'avais pas rafraichi)

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Déjà, merci beaucoup pour vos réponses!

    Le userform2 initialize en minuscule, c'est une faute de ma part ici, dans mon vba il était bien avec les majuscules. En fait je suis en vacances, et je n'ai pas le fichier chez moi, du coup je réécrivais de tête...

    J'ai recréé chez moi, et je n'ai plus ce fameux souci, du coup c'est résolu. Mais j'aimerai encre comprendre pas mal de choses!

    Est ce que l'ordre des déclarations à une importance? Parce que par exemple dans mon UserForm2 je pense que la déclaration du BT2_Click se trouvait par dessus l'UserForm_Initialize.

    La différence entre l'utilisation de l'Initialize ou l'Activate est encore floue. Idem entre Hide et Unload.

    Et si vous avez encore des conseils pour bien débuter je suis preneur.
    Je compte rassembler certaines fonctions en Module, et plus toujours tout écrire dans les UserForms (parfois certaines fonctions sont identiques)
    Je compte aussi vérifier les informations encodées, et ne les traiter que s'il n'y a pas d'erreurs (création d'une variable erreur --> puis condition pour traiter)

    Et sans vouloir m'éloigner d'avantage de mon problème initial j'ai vu debug.print , explicit , c'est des choses qui peuvent m'aider à prendre de bonnes habitudes, mener un projet plus proprement?

    Merci beaucoup

    Code actuel UserForm1
    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
    Private Sub UserForm_Initialize()
     
        If Day(Now) < 10 Then
            TB_DateJ = "0" & Day(Now)
        ElseIf Day(Now) > 9 Then
            TB_DateJ = Day(Now)
        End If
     
        If Month(Now) < 10 Then
            TB_DateM = "0" & Month(Now)
        ElseIf Month(Now) > 9 Then
            TB_DateM = Month(Now)
        End If
     
    End Sub
     
    Private Sub BT1_Click()
        UserForm2.Show
    End Sub
    Code actuel UserForm2
    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
     
    Private Sub UserForm_Initialize()
        TB_Date = UserForm1.TB_DateJ + "/" + UserForm1.TB_DateM + "/19"
        TB_Heure = UserForm1.TB_Hr + "." + UserForm1.TB_Min + "hrs"
        TB_Nom = UserForm1.TB_Nom
        TB_Prenom = UserForm1.TB_Prenom
    End Sub
     
     
    Private Sub BT2_Click()
        'Traitement
        MsgBox "Bonjour " & TB_Nom & " " & TB_Prenom
     
        'Réinitialisation des champs du formulaire
        TB_Date = ""
        TB_Heure = ""
        TB_Nom = ""
        TB_Prenom = ""
        TB_Email = ""
     
        Unload Me
     
    End Sub

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    Initialize est exécuté lorsque l'UF a besoin d'être construit. La 1ère fois donc, ou bien après un Unload (et non un Close comme j'avais écrit. Pas encore bien réveillé à 13h45 :-) )
    Activate est exécuté à chaque affichage demandé (.Show)
    Initialize est toujours suivi d'un Activate.
    Hide le cache mais ne le détruit pas (pas d'Initialize ensuite), Unload le décharge (Initialize si on le ré-affiche)

    eric

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

Discussions similaires

  1. Comment faire un reset d'une variable
    Par java250r dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 12/04/2012, 14h28
  2. [Débutant] [VB.NET] Variable integer qui reset toujours a 0
    Par jeromestj dans le forum ASP.NET
    Réponses: 3
    Dernier message: 14/06/2011, 21h11
  3. Erreur sur reset d'une variable
    Par Franck_P dans le forum Formules
    Réponses: 4
    Dernier message: 30/05/2011, 21h05
  4. [XL-2002] Reset des variables globales lié à création d'OleObjects ?
    Par zigmo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/04/2011, 17h03
  5. reset de certaines variables de session
    Par gazelle dans le forum Langage
    Réponses: 4
    Dernier message: 19/03/2008, 11h34

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