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 Sub

l'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

30compteurs-7000.xlsm (127.45 Ko)

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 Sub

Code à 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 Sub

Code à 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 Sub

Hervé.

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 Sub

mais 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

29compteurs-7000.xlsm (132.39 Ko)

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 Sub

Hervé.

Ça marche nickel

Merci beaucoup

Rechercher des sujets similaires à "boucle private sub"