contrôle de saisie dans USF

  • Initiateur de la discussion lo
  • Date de début
L

lo

Guest
Bonjour le forum !

Après plusieurs heures de recherches je me permets à un nouveau un petit post.
Je cherche à mettre un contrôle de saisie dans mon userform, de façon à limiter les erreurs. J'ai trouvé pas mal d'infos ici :
http://www.gaboly.com/VBA/CodeSimplifieControle.html

Cependant je me demandais s'il ne pouvait pas y avoir qq choses de plus simple sachant que pour que la validation soit acceptée il faudrait que les textbox: NOM / ADRESS / CP / VILLE soient renseignés obligatoirement et "plus dur" qu'au moins une textbox sur trois (que l'on va appelé Textbox1, Textbox2 et Textbox3) soit remplie.

Voici mon code actuel pour info :

Private Sub Valider_Click()
Dim Ligne As Integer
Dim sjour As String
Dim qu As String
Dim nom As String
Dim adress As String
Dim cp As String
Dim ville As String

Ligne = Sheets("Saisie").Range("D65536").End(xlUp).Row + 1
Worksheets(1).Activate
Cells(Ligne, 1).Value = sjour
Cells(Ligne, 2).Value = qu
Cells(Ligne, 4).Value = nom
Cells(Ligne, 5).Value = adress
Cells(Ligne, 6).Value = cp
Cells(Ligne, 7).Value = ville

Dim CTRL As Control
For Each CTRL In Controls
If TypeOf CTRL Is MSForms.TextBox Then
If Not CTRL.Tag = "NonReset" Then CTRL = ""
End If
Next CTRL

Exit Sub


Merci à tous, et bonne journée!
 
S

salim

Guest
Bonjour Lo et le Forum

Lo je ne suis pas un expert loin de là mais je n'arrive pas à comprendre ton code tu déclares des variables de type String mais elles correspondent à quoi ? si elles correspondent aux TextBox tu n'as qu'a nommer tes TextBox directement avec ces noms et ensuite faire une boucles sur les TextBox por savoir si elles sont renseignées ou pas.

For Each CTRL in Me.Controls
If TypeOf CTRL Is MSForms.TextBox Then
If CTRL = " " Then
<instructions>
End If
Next CTRL

Ou alors j'ai rien compris ce qui est très probable
.

@+ Salim
 
@

@+Thierry

Guest
Bonjour Lo, le Forum

Il y a plusieurs moyens, si tu regardes mes démos dans ce Forum, j'en ai dévoilé plusieurs.

Dans ton cas en reprenant cette fameuse boucle For Each CTRL on peut faire un truc dans le Style :

Private Sub CommandButton1_Click()
Dim CTRL As Control
Dim CTRLName As String
Dim Bad As Byte

&nbsp;&nbsp;For Each CTRL In Controls
&nbsp;&nbsp;&nbsp;&nbsp;If TypeOf CTRL Is MSForms.TextBox Then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If CTRL.Name = "TextBox1" Or CTRL.Name = "TextBox2" Or CTRL.Name = "TextBox3" Then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If CTRL = "" Then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bad = Bad + 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CTRLName = CTRLName & CTRL.Name & vbCrLf
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If
&nbsp;&nbsp;&nbsp;&nbsp;End If
Next CTRL

Select Case Bad
Case 1
&nbsp;&nbsp;MsgBox "Le Control TextBox : " & vbCrLf & CTRLName & " est Vide", vbCritical
&nbsp;&nbsp;Exit Sub
Case 2, 3
&nbsp;&nbsp;MsgBox "Les Controls TextBoxes : " & vbCrLf & CTRLName & " &nbsp;&nbsp;sont Vides", vbCritical
Exit Sub
End Select

End Sub

Je n'ai pas intégré ta macro, car tes noms de controls ne sont pas mentioné ici mais tout ce que je sais c'est qu'il ne semble pas nécessaire de passer par des variables (sjour, su, nom...) si tu as utilisé la démonination par défaut (TextBox1, TextBox2, 3 etc) tu peux faire ceci directement exemple :

Option Explicit
Private Sub CommandButton1_Click()
Dim CTRL As Control
Dim CTRLName As String
Dim Bad As Byte
Dim Ligne As Integer
Dim Colon As Byte

&nbsp;&nbsp;For Each CTRL In Controls
&nbsp;&nbsp;&nbsp;&nbsp;If TypeOf CTRL Is MSForms.TextBox Then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If CTRL.Name = "TextBox1" Or CTRL.Name = "TextBox2" Or CTRL.Name = "TextBox3" Then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If CTRL = "" Then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bad = Bad + 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CTRLName = CTRLName & CTRL.Name & vbCrLf
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End If
&nbsp;&nbsp;&nbsp;&nbsp;End If
&nbsp;&nbsp;Next CTRL

Select Case Bad
Case 1
&nbsp;&nbsp;MsgBox "Le Control TextBox : " & vbCrLf & CTRLName & " est Vide", vbCritical
&nbsp;&nbsp;Exit Sub
Case 2, 3
&nbsp;&nbsp;MsgBox "Les Controls TextBoxes : " & vbCrLf & CTRLName & " sont Vides", vbCritical
&nbsp;&nbsp;Exit Sub
End Select

&nbsp;With Sheets("Saisie")
&nbsp;&nbsp;Ligne = .Range("D65536").End(xlUp).Row + 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For Colon = 1 To 7
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Cells(Ligne, Colon) = Controls("TextBox" & Colon)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next Colon
&nbspEnd With

&nbsp;&nbsp;For Each CTRL In Controls
&nbsp;&nbsp;&nbsp;&nbsp;If TypeOf CTRL Is MSForms.TextBox Then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If Not CTRL.Tag = "NonReset" Then CTRL = ""
&nbsp;&nbsp;&nbsp;&nbspEnd If
&nbsp;&nbsp;Next CTRL

End Sub


Bonne Journée
@+Thierry
 
@

@+Thierry

Guest
Bonjour Salim,

Désolé je ne t'avais pas vu, mais tu as tout à fait raison, pas besoin (à mon avis de passer par des Variables pour récupérer le contenu des TextBox, mais comme on ne sait pas trop ce que Lo a dans son UserForm, c'est difficile de dire d'avance...

Par contre attention Salim : If CTRL = " " Then
Ne Signifie pas "Vide" mais un Espace... le Vrai Vide c'est If CTRL = "" Then

Bonne Journée
@+Thierry
 
S

salim

Guest
Bonjour @+Thierry

C'est pas grave on s'est croisé, effectivement cela signifie un espace en plus je l'ai appris y'a pas longtemps mais en fait pour plus de lisibilité j'ai voulu aéré le texte et j'ai commi une erreur comme quoi tout à son importance
Merci
.


@+ Salim
 
L

lo

Guest
Bonjour Thierry, Salim, re le forum.

Voici une copie exacte de mon code ce sera peut être plus clair :

Private Sub UserForm_Activate()
TBsjour.Value = Format(Now, "MM/DD/YYYY") ' date auto
TBsjour.Enabled = False ' empèche toute modification sur le textbox
End Sub

'page saisie
Private Sub Valider_Click()
Dim Ligne As Integer
Dim sjour As String
Dim qu As String
Dim nom As String
Dim adress As String
Dim cp As String
Dim ville As String
Dim cour As String
Dim net As String
Dim pt As String
Dim lp As String
Dim un As String
Dim ept As String
Dim sept As String
Dim laforetpt As String
Dim artlp As String
Dim laforetlp As String
Dim capeblp As String
Dim intun As String
Dim perun As String

On Error GoTo Err
sjour = TBsjour.Value
qu = TBqu.Value
nom = UCase(TBnom.Value)
adress = TBadress.Value
cp = TBcp.Value
ville = UCase(TBville.Value)
cour = TBcour.Value
net = TBnet.Value
pt = TBpt.Value
lp = TBlp.Value
un = TBun.Value
ept = TBept.Value
sept = TBsept.Value
lpt = TBlaforetpt.Value
artlp = TBartlp.Value
llp = TBlaforetlp.Value
clp = TBcapeblp.Value
intun = TBintun.Value
perun = TBperun.Value

Ligne = Sheets("Saisie").Range("D65536").End(xlUp).Row + 1
Worksheets(1).Activate
Cells(Ligne, 1).Value = sjour
Cells(Ligne, 2).Value = qu
Cells(Ligne, 4).Value = nom
Cells(Ligne, 5).Value = adress
Cells(Ligne, 6).Value = cp
Cells(Ligne, 7).Value = ville
Cells(Ligne, 8).Value = cour
Cells(Ligne, 9).Value = net
Cells(Ligne, 10).Value = pt
Cells(Ligne, 11).Value = ept
Cells(Ligne, 12).Value = sept
Cells(Ligne, 13).Value = lpt
Cells(Ligne, 14).Value = lp
Cells(Ligne, 15).Value = artlp
Cells(Ligne, 16).Value = llp
Cells(Ligne, 17).Value = clp
Cells(Ligne, 18).Value = un
Cells(Ligne, 19).Value = intun
Cells(Ligne, 20).Value = perun

' en cours de test :
If IsMissing(TexteMessage) Then
TexteMessage = "Vous n'avez pas indiqué " & ComplTexte
End If

Dim CTRL As Control
For Each CTRL In Controls
If TypeOf CTRL Is MSForms.TextBox Then
If Not CTRL.Tag = "NonReset" Then CTRL = ""
End If
Next CTRL

Exit Sub
Err:
MsgBox "Oupppsssss erreur"
End Sub

Private Sub TBnom_Exit(ByVal Cancel As MSForms.ReturnBoolean)
TBnom.Value = UCase(TBnom.Value)
End Sub

Private Sub Quit_Click()
Unload tpo
End Sub


Cela pourra peut être aider Salim à comprendre mon code ;-)


Je n'ai pas intégré ta macro, car tes noms de controls ne sont pas mentioné ici mais tout ce que je sais c'est qu'il ne semble pas nécessaire de passer par des variables (sjour, su, nom...) si tu as utilisé la démonination par défaut (TextBox1, TextBox2, 3 etc) tu peux faire ceci directement exemple : => je le saurais pour l'avenir. En fait j'avais posé des variables pour soucis de "lisibilité". Je ne le referais plus promis ;-)

Je vais me pencher sur vos deux idées dès maintenant. Merci les gars
 

Discussions similaires

Statistiques des forums

Discussions
312 339
Messages
2 087 414
Membres
103 542
dernier inscrit
feenix