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 ?

42userform.xlsm (20.00 Ko)

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.

Rechercher des sujets similaires à "userform controles multiples"