UserForm Contrôles multiples
Bonjour,
J'essaie de mettre en place des contrôles sur un UserForm.
L'utilisateur doit saisir un code ISIN, une date puis cliquer sur un bouton valider.
Je vérifie que le code ISIN et la date rentrés sont aux formats attendus.
S'ils ne sont pas aux bons formats, je fais apparaître des commentaires.
Mon problème c'est que si l'utilisateur ne saisit ni un code ISIN, ni une date, il n'y a que le commentaire se rapportant au Code ISIN qui s'affiche. Problème identique si l'utilisateur saisit une date au mauvais format mais pas de code ISIN, seul le commentaire se rapportant au code ISIN s'affiche, pas le commentaire sur le mauvais format de date.
Est-ce que vous sauriez comment faire pour faire apparaître le commentaire attendu dès lors que le textbox est vide ou au mauvais format ?
Bonjour,
C'est quelque peu alambiqué... mais tu verras à l'usage...
Dans l'immédiat, tu ne testes la date que si le code ISIN est ok...
Il te faut tester les deux successivement, donc le ElseIf est inadéquat ! Tu boucles ton test ISIN (End If) et tu démarres ton test date avec If...
Cordialement.
Salut MFerrand (le sujet est dans la continuité d'un sujet pour lequel tu m'avais aidé
J'ai modifié en suivant tes indications et ça fonctionne. Merci
J'ai une autre question par rapport à mon fichier, je vais avoir plusieurs TextBox de type Date qui vont mettre en oeuvre la procédure TextBox1_Change () (nb. à renommer surement pour que cela soit moins spécifique), et le même contrôle :
If Len(TextBox1) < 10 Then
Label_Erreur_Date.Visible = True
Me.Width = 255 'Largeur de l'UserForm
End If
If Not IsDate(TextBox1) Then
Label_Erreur_Date.Visible = True
Me.Width = 255 'Largeur de l'UserForm
End If
Est-ce qu'il serait possible de ne pas répéter ces bouts de code, mais de les écrire une fois et de les appliquer pour chaque TextBox de type Date ?
Bien sûr, tu peux faire une procédure commune, à lancer avec le numéro de TextBox par exemple pour que la procédure l'identifie...
Ok. J'essaye d'écrire quelque chose comme ça mais ça ne fonctionne pas...
Private Sub CommandButton1_Click()
Dim x As Integer
For x = 1 To 1
Controle_Date (x)
Next x
End Sub
Private Sub Controle_Date(x As Integer)
If Len("TextBox" & x) < 10 Then
"Label_Erreur_Date" & x.Visible = True
Me.Width = 255 'Largeur de l'UserForm
ElseIf Not IsDate("TextBox" & x) Then
"Label_Erreur_Date" & x.Visible = True
Me.Width = 255 'Largeur de l'UserForm
End If
End Sub
C'est pas de ta proc de vérification que je parlais, il s'agit de tes procédures TextBox...
Si tu as plusieurs TextBox sur lesquels tu fais la même saisie, plutôt que répéter autant de procédure Change, tu mets une seule procédure de type par exemple :
Sub SaisieDate(n As Integer)
n étant le numéro d'ordre du TextBox
et pour la proc Change de TextBox 1 :
Private Sub TextBox1_Change()
SaisieDate 1
End Sub
De même pour les autres, avec chacun son numéro d'ordre.
Dans SaisieDate, tu identifies le TextBox concerné par : Controls("TextBox" & n)....
Par contre la vérification finale sur CommandButton1, tu opères la vérification successive de chaque TextBox avec une boucle :
exemple :
For i = 1 To 3
etc.
Cordialement.
Salut Mferrand,
J'ai suivi tes instructions et ça fonctionne bien. Par contre je ne vois pas clairement ce qu'est Controls() ?
J'ai le code suivant où j'aimerai nommer les différents labels que je fais apparaître en cas de format de date erroné ainsi Label_Erreur_Date1, Label_Erreur_Date2, etc.
Mais comment les appeler dans la boucle For ? A priori Label_Erreur_Date& j.Visible = True ne fonctionne pas
For j = 1 To 1
If Len(Controls("TextBox" & j)) < 10 Then
Label_Erreur_Date& j.Visible = True
Me.Width = 255 'Largeur de l'UserForm
End If
If Not IsDate(Controls("TextBox" & j)) Then
Label_Erreur_Date& j.Visible = True
Me.Width = 255 'Largeur de l'UserForm
End If
Next j
Controls te permet d'appeler un contrôle quelconque par son nom : tu l'utiliseras généralement pour faire une boucle sur plusieurs contrôles :
For i = 1 to 8
Controls("TextBox" & i) = ...
Next i
au lieu de :
TextBox1 = ...
TextBox2 = ...
TextBox3 = ...
TextBox4 = ...
TextBox5 = ...
TextBox6 = ...
TextBox7 = ...
TextBox8 = ...
Merci grâce à toi j'ai le code suivant :
'Formate la saisie XX/XX/XXXX
Sub SaisieDate(n As Integer)
Dim Valeur As Byte
Controls("TextBox" & n).MaxLength = 10 'nb caractères maxi autorisé dans le textbox
Valeur = Len(Controls("TextBox" & n))
If Valeur = 2 Or Valeur = 5 Then TextBox1 = TextBox1 & "/"
End Sub
Private Sub TextBox1_Change()
SaisieDate 1
End Sub
'N'autorise la saisie que de chiffres
Private Sub Textbox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
TextBox1.BackColor = &H80000005
If InStr("0123456789", VBA.Chr(KeyAscii)) = 0 Then
KeyAscii = 0
TextBox1.BackColor = &HFF&
End If
End Sub
'Ensuite pour vérifier que c'est bien une date qui a été saisie
Private Sub CommandButton1_Click()
Dim vch$, v(1), i%
vch = UCase(TextBox2.Value)
For i = 1 To Len(vch)
Select Case Asc(Mid(vch, i, 1))
Case 48 To 57
v(0) = v(0) + 1
Case 65 To 90
v(1) = v(1) + 1
Case Else
vch = "": Exit For
End Select
Next i
If Not (v(0) > 0 And v(1) > 0 And Len(TextBox2) = 12) Then
Label_Erreur_ISIN.Visible = True
Me.Width = 255 'Largeur de l'UserForm
End If
Dim j%
For j = 1 To 1
If Len(Controls("TextBox" & j)) < 10 Then
Me.Controls("Label_Erreur_Date_" & j).Visible = True
Me.Width = 255 'Largeur de l'UserForm
End If
If Not IsDate(Controls("TextBox" & j)) Then
Me.Controls("Label_Erreur_Date_" & j).Visible = True
Me.Width = 255 'Largeur de l'UserForm
End If
Next j
'...la suite de la procédure
End Sub
Et ça fonctionne
Encore merci pour ton aide. Je ferme le sujet.
A bientôt.