Décalage des informations demandées dans un UserForm / Rafraichissement UF?

Bonjour à tous ! et merci de prendre le temps de me lire..

Voici mon problème, j'espère qu'il sera clair : j'ai créé dynamiquement des Labels et des CommandButtons. Ces controls contiennent des informations différentes selon les clients sélectionnés. Ces informations sont recensées dans un UserFrom qui s'ouvre par un bouton. Chaque client est associé à un bouton.

Ex: lorsqu'on clique sur le client1 => date d'inscription client1 ;

lorsqu'on clique sur le client2 => date d'inscription client2 ;

lorsqu'on clique sur le client3 => date d'inscription client3 ; ...

Cependant, j'ai remarqué que les controls ne contiennent pas les bonnes informations ! En fait, il y a un décalage et voici ce qui se produit réellement aujourd'hui :

essai n°1 : lorsqu'on clique sur le client1 => rien ;
essai n°2 : lorsqu'on clique sur le client2 => date d'inscription client1 (soit les informations demandées précédemment) ;
essai n°3 : lorsqu'on clique sur le client3 => date d'inscription client2 (soit les informations demandées précédemment) ; ...

Voici la procédure avec laquelle mes controls sont créés à l'ouverture de l'UserForm par un bouton :

Sub Informations_Click()

    Dim i, Cpt, Nb_Ligne As Integer
    Nb_Ligne = Sheets("Programme Fidélité").Cells(7, 7).Value              'nombre de ligne = nombre de passages pour réduction
    Cpt = 1
    Dim Suppr As MSForms.CommandButton

UserForm3.Show

    'Récupérer_ligne_du_bouton_cliqué()
    Dim sh As Shape
    Set sh = ActiveSheet.Shapes(Application.Caller) 'recupere le bouton cliqué
    Dim ligne As Long
    Dim colonne As Long
    ligne = sh.TopLeftCell.Row                       'N° ligne du bouton
    colonne = sh.TopLeftCell.Column                  'N° colonne du bouton
    'MsgBox ("ligne=" & ligne & " et colonne=" & colonne)       'test variables

'------------------------------------------------------------------------------CREATION DES LABELS ET BOUTONS----------------------'
    'insérer le titre et récupérer le nom du client comme titre
    UserForm3.Controls.Add "Forms.label.1", "Nom du client"
    With UserForm3.Controls("Nom du client")
        .Width = 246
        .Height = 12
        .Top = 12
        .Left = 18
        .Caption = "Infos : " & Cells(ligne, colonne - 7).Value & " " & Cells(ligne, colonne - 6).Value
        .Font.Bold = True
        .Font.Italic = True
        .Font.Size = 11
        .ForeColor = RGB(0, 0, 255)
    End With

    ' boucle de création des LABELS avec mise en place de leur "action" par le module de classe
    For i = 1 To Nb_Ligne

            ' création de la numérotation des passages "Numéro passage"
            UserForm3.Controls.Add "Forms.Label.1", "Numéro passage" & i            
            With UserForm3.Controls("Numéro passage" & i)
                .Width = 45
                .Height = 18
                .Top = 36 + ((i - 1) * 18)                        'premier bouton à 36 de Top, puis décalage de 18 pour chaque nouveau bouton
                .Left = 18
                .BackStyle = fmBackStyleTransparent
                .Font.Bold = True
                .Font.Size = 8.5
                .Caption = i & "."                                               'Numéro du passage, à condition qu'il existe
            End With

            ' création du LABEL "Date de passage"
            UserForm3.Controls.Add "Forms.Label.1", "Date de passage" & i             'créer uf3 avec des labels nommés "act"+nombre ?
            With UserForm3.Controls("Date de passage" & i)
                .Width = 96
                .Height = 18
                .Top = 36 + ((i - 1) * 18)                         'premier bouton à 36 de Top, puis décalage de 18 pour chaque nouveau bouton
                .Left = 39
                .BackStyle = fmBackStyleTransparent
                .Font.Bold = True
                .Font.Size = 8.5
            If Cells(ligne, colonne + i * 2 - 1).Value <> "" Then
                .Caption = "Le " & Cells(ligne, colonne + i * 2 - 1).Value   'date du passage, à condition qu'elle existe
            Else: .Caption = "Le           -   "
            End If
            End With

            ' création du LABEL "Montant du passage"
            UserForm3.Controls.Add "Forms.Label.1", "Montant du passage" & i
            With UserForm3.Controls("Montant du passage" & i)
                .Width = 96
                .Height = 18
                .Top = 36 + ((i - 1) * 18)
                .Left = 147
                .BackStyle = fmBackStyleTransparent
                .Font.Bold = True
                .Font.Size = 8.5
            If Cells(ligne, colonne + i * 2).Value <> "" Then
                .Caption = Cells(ligne, colonne + i * 2).Value & " €"
            Else: .Caption = "  -  €"
            End If
            End With

            ' création du BOUTON "Supprimer", à condition qu'un montant puisse lui être attribué
            If Cells(ligne, colonne + i * 2).Value <> "" Then
            Set Suppr = UserForm3.Controls.Add("Forms.CommandButton.1", "Supprimer" & i)
            With Suppr
                .Width = 54
                .Height = 18
                .Top = 31 + ((i - 1) * 18)
                .Left = 210
                .BackStyle = fmBackStyleTransparent
                .Font.Bold = True
                .Font.Size = 8
                'End Sub
                '.TextAlign = fmTextAlignCenter
                .Caption = "Supprimer"
            End With
            End If

            ' on incrémente le nombre de bouton pour le bouton suivant
            Cpt = Cpt + 1
        If Cpt > Nb_Ligne Then Exit For
    Next i

End Sub

Les pistes que j'ai déjà étudiées pour régler mon problème :

- l'identification du client avec la récupération de la ligne et de la colonne du client ==> ça fonctionne bien

- supprimer tous les controls au moment de la fermeture de l'UserForm ==> pas réussi à mettre en oeuvre, peut-être à approfondir ?

Merci par avance pour vos conseils !

Bonjour,

Aurais-tu un fichier lambda avec informations bidons pour voir de plus prêt le fonctionnement du programme ?

A bientot

Bonjour Moul, merci pour ta réponse.

Voici mon fichier test. Il s'agit des boutons "ouvrir" associés à chaque client, qui sont liés à la macro "Informations" et au UserForm3.

Merci par avance

Ceci est dû au faite que tu charge l'userform avant de le programmer.

Autrement dit si en premier tu cliques sur le personnel 4, la première fois tu ne verras rien. En suivant tu cliques sur le personnel 1 tu auras les informations du 4. etc...

Pour contrer cela, lorsque tu ouvre l'userform 3 passe le en modal 0. C'est à dire que le programme actuelle continue de tourner même après l'affichage de l'userform.

Un userform non modal fonctionne comme un msgbox. Il stop le programme jusqu'à sa fermeture. Puis le programme reprend normalement.

Je sais pas si je m'exprime clairement...

Plus simplement remplace :

Userform3.show

Par

Userform3.show 0

et ca devrait fonctionner.

Tiens moi au courant

Salut !

Merci c'était vraiment tout bête ! Finalement, j'ai simplement déplacer mon "UserForm3.Show" à la fin de mon code !

Merci, à la prochaine.

Rechercher des sujets similaires à "decalage informations demandees userform rafraichissement"