Boucle sur private sub
Hello
J'au un formulaire (Userform) et pour chaquin de mes champ (TextBox) j'aimerait changer les couleur selon ce que l'on rentre comme valeur
J'ai 20 champs et peut-etre plus par la suite, j'aimerait donc faire une boucle sur le "Private Sub"
par exemple mon code pour la box2
Private Sub TextBox2_Change()
Dim DernLigne As Long
Dim val As Integer
DernLigne = Range("A" & Rows.Count).End(xlUp).Row
DernLigne = DernLigne + 1
val = Cells(DernLigne - 1, 2)
If TextBox2.Value <= val Then
TextBox2.BackColor = RGB(255, 0, 0) 'couleur rouge
Else
TextBox2.BackColor = RGB(0, 255, 0) 'couleur vert
End If
End Subl'idée c'est de pouvoir mettre ca en boucle pour mes autres box
elles sont nomées de 1 a 20 donc on doit pouvoir faire qqch avec une incrémentation
merci de votre aide
Bonjour,
Je te propose d'utiliser un module de classe afin que tous tes TextBox aient le même événement (Change). Ceci te permets d'utiliser autant de TexBox que tu souhaite dans les limites de la mémoire.
Code à mettre dans un module de classe que tu va nommer "ClsTxt" (dans la fenêtre des propriétés en bas à gauche, propriété "Name") :
'A mettre dans un module de classe que tu nomme ClsTxt
Public WithEvents GroupeTxt As MSForms.TextBox
Private Sub GroupeTxt_Change()
Colorer GroupeTxt
End SubCode à mettre dans le module de ton UserForm :
Dim Txt() As New ClsTxt
Private Sub UserForm_Initialize()
Dim Ctrl As Control
Dim I As Integer
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" Then
I = I + 1
ReDim Preserve Txt(1 To I)
Set Txt(I).GroupeTxt = Ctrl
End If
Next Ctrl
Set Ctrl = Nothing
End SubCode à mettre dans un module standard (ça, c'est ta proc) :
Sub Colorer(Txt As MSForms.TextBox)
Dim DernLigne As Long
Dim val As Integer
DernLigne = Range("A" & Rows.Count).End(xlUp).Row
DernLigne = DernLigne + 1
val = Cells(DernLigne - 1, 2)
If Txt.Value <= val Then
Txt.BackColor = RGB(255, 0, 0) 'couleur rouge
Else
Txt.BackColor = RGB(0, 255, 0) 'couleur vert
End If
End SubHervé.
merci ca marche presque nikel
en fait dans mon code:
Sub Colorer(Txt As MSForms.TextBox)
Dim DernLigne As Long
Dim val As Integer
DernLigne = Range("A" & Rows.Count).End(xlUp).Row
val = Cells(DernLigne, 2)
If Txt.Value <= val Then
Txt.BackColor = RGB(255, 0, 0) 'couleur rouge
Else
Txt.BackColor = RGB(0, 255, 0) 'couleur vert
End If
End Sub
la ligne
val = Cells(DernLigne, 2)le 2 dans l'exemple j'aimerait qu'il s'adapte a la collonne
exemple pour le champ TextBox3 ca doit etre la collone C donc la valeur 3
J'ai trouve une facon de faire
Sub Colorer(Txt As MSForms.TextBox)
Dim DernLigne As Long
Dim val As Long
Dim col As Long
DernLigne = Range("A" & Rows.Count).End(xlUp).Row
col = Txt.TabIndex
val = Cells(DernLigne, col)
If Txt.Value <= val Then
Txt.BackColor = RGB(255, 0, 0) 'couleur rouge
Else
Txt.BackColor = RGB(0, 255, 0) 'couleur vert
End If
End Submais c'est pas du tout propre et de plus si le champ "TabIndex n'as pas le meme numero que la collane ca ne joue pas
si vous voyez une façon plus propre de le faire ca serait parfait
Bonjour,
Des façons plus propres il y en a plusieurs et c'est à l'appréciation de chacun mais c'est plus précise qui est nécessaire et là, je te propose de renommer tes TextBox de la façon suivante, Txt_1, Txt_2, Txt_3, etc... Le préfixe "Txt" n'a pas trop d'importance, c'est la seconde partie qui en a. Donc, tu numérote tes TextBox par rapport à la colonne à laquelle il correspondent. Dans le code ci-dessous, j'utilise la fonction Split pour récupérer le chiffre ou nombre de la colonne et donc le tiret doit être positionné juste devant le chiffre.
Une petite précision qui m'a échappée la première fois, évite d'utiliser des mots réservés VB pour nommer tes variables, ici c'est Val que j'ai transformé en Valeur :
Sub Colorer(Txt As MSForms.TextBox)
Dim DernLigne As Long
Dim Valeur As Integer
Dim Col As Integer
DernLigne = Range("A" & Rows.Count).End(xlUp).Row
DernLigne = DernLigne + 1
Col = CInt(Split(Txt.Name, "_")(1))
Valeur = Cells(DernLigne - 1, Col)
If Txt.Value <= Valeur Then
Txt.BackColor = RGB(255, 0, 0) 'couleur rouge
Else
Txt.BackColor = RGB(0, 255, 0) 'couleur vert
End If
End SubHervé.
Ça marche nickel
Merci beaucoup