Code répété pour chaque action de l'utilisateur

bouligrain Messages postés 5 Date d'inscription mardi 28 avril 2009 Statut Membre Dernière intervention 9 juin 2009 - 8 juin 2009 à 16:11
bouligrain Messages postés 5 Date d'inscription mardi 28 avril 2009 Statut Membre Dernière intervention 9 juin 2009 - 9 juin 2009 à 13:45
Bonjour à tous,
J'ai une question concernant un formulaire excel.
Comment faire pour qu'une action s'effectue à chaque fois qu'un contrôle est changé?
Je m'explique, j'ai le code suivant (grâce à l'un d'entre vous):

Dim maFrame As Object
Dim LastPos As Long
    LastPos = 10
    For Each maFrame In Controls
        If maFrame.Name Like "Frame*" Then
            If maFrame.Visible = True Then
                maFrame.Top = LastPos + 10
                ' Décale la prochaine
                LastPos = maFrame.Top + maFrame.Height + 5
            End If
        End If
    Next
 
UserForm1.Height = LastPos + 30

Il permet de positionner les textboxs les uns à la suite des autres selon qu'ils sont visibles ou non.
Il fonctionne très bien pour l'action Userform_Initialize, mais j'aimerais l'appliquer dès que l'utilisateur fait de nouveaux choix, donc à chaque fois qu'un contrôle est changé (et qu'un frame apparait ou disparait).
J'ai tenté avec UserForm_Activate, et en rajoutant une boucle, mais ça ne marche pas non plus. Je suis un peu perdue.
Est-ce que quelqu'un aurait une idée?
Merci beaucoup d'avance!

2 réponses

Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
9 juin 2009 à 09:23
Bonjour,

Pour faire cela il faut placer le code dans les procédures événementielles de chaque contrôles de ton formulaire (click, change, etc..). Pour faire plus propre, tu peux crée une routine (sub) ou tu vas placer ton code comme ceci :

Private Sub RefreshControls()

Dim maFrame As Object
Dim LastPos As Long

    LastPos = 10
    For Each maFrame In Controls
        If maFrame.Name Like "Frame*" Then
            If maFrame.Visible = True Then
                maFrame.Top = LastPos + 10
                ' Décale la prochaine
                LastPos = maFrame.Top + maFrame.Height + 5
            End If
        End If
    Next
 
UserForm1.Height = LastPos + 30

End Sub

Puis tu appel cette routine dans les évenement de tes contrôles :

Private Sub UserForm_Resize()
     Call RefreshControls
End Sub

Voila.

 Remarque: Ton code ne déplace pas tes Textbox mais seulement les frames qui les contiennent.

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
0
bouligrain Messages postés 5 Date d'inscription mardi 28 avril 2009 Statut Membre Dernière intervention 9 juin 2009
9 juin 2009 à 13:45
Super merci bien!
0
Rejoignez-nous