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.