Rendre une textbox non obligatoire à remplir

Bonjour, j'aimerais rajouter 2 fonction à mon formulaire. J'ai ajouté une textbox "commentaire" dont je souhaiterais rendre le remplissage facultatif.

J'ai une routine qui affiche les textbox vident en rouge, comment ajouter une option qui rend 1 textbox facultative :

Function VerifierFRM() As Boolean 'Fonction controle si textbox et combobox sont remplies
Dim ctl As Control
VerifierFRM = False
With FormaulaireOpe
For Each ctl In FormulaireOpe.Controls
If TypeOf ctl Is MSForms.TextBox Then
If ctl = "" Then
ctl.BackColor = vbRed
VerifierFRM = True
Else
ctl.BackColor = vbWhite
End If
ElseIf TypeOf ctl Is MSForms.ComboBox Then
If ctl.ListIndex = -1 Then
ctl.BackColor = vbRed
VerifierFRM = True
Else
ctl.BackColor = vbWhite
End If
End If
Next ctl
End With
End Function

Mon deuxième ajout serait d'afficher un message d'alerte si la somme des textbox (copeaux, preventif, réglage attente et pannes) est supérieur à 8.

Je vous joins mon fichier et j'espère avoir été assez clair, merci d'avance !

Bonjour,

Pour poster du code, vous pouvez utiliser les balises </> du ruban d'icônes .

Voici un essai :

Function VerifierFRM() As Boolean 'Fonction controle si textbox et combobox sont remplies

Dim ctl As Control
VerifierFRM = False

With FormaulaireOpe
    For Each ctl In FormulaireOpe.Controls
        If TypeOf ctl Is MSForms.TextBox Then
            If ctl.name <> "tbcommentaire" and ctl = "" Then '<<<<<<<<<<<<<< ADAPTER NOM
                ctl.BackColor = vbRed
                VerifierFRM = True
            Else
                ctl.BackColor = vbWhite
            End If
        ElseIf TypeOf ctl Is MSForms.ComboBox Then
            If ctl.ListIndex = -1 Then
                ctl.BackColor = vbRed
                VerifierFRM = True
            Else
                ctl.BackColor = vbWhite
            End If
        End If
    Next ctl
End With

End Function

Ici, il faut remplacer tbcommentaire par le vrai nom de la textbox en question.

Cdlt,

Pour le second problème (que je n'avais pas vu dans la précipitation), voici un essai où il faudra corriger les noms encore une fois :

function ControleSomme() as boolean

t = array("copeaux", "preventif", "réglage attente", "pannes")

With FormaulaireOpe
    For Each ctl In .Controls
        for i = lbound(t) to ubound(t)
            if ctl.name = t(i) then
                Somme = Somme + ctl.value * 1
                exit for
            end if
        next i
    Next ctl
End With

if Somme > 8 then
    msgbox "La somme est supérieure à 8", vbcritical, "Validation de saisie"
else
    ControleSomme = true
end if

end function

Cdlt,

Excusez moi, je débute en VBA, pour le second problème quel nom dois-je modifier ?

Il faut à chaque fois remplacer les noms des textbox du code (utilisés à titre d'exemple) par les noms réels de vos textbox.

Dans le second code :

t = array("copeaux", "preventif", "réglage attente", "pannes")

Les termes entre guillements sont les noms de textbox à modifier.

Dans le premier code, c'est le nom "tbcommentaire" qu'il faut remplacer.

Edit : D'ailleurs, je viens de regarder et d'éditer le second code dans lequel il y avait une petite bourde !

Je crois avoir compris j'ai donc modifier le cde comme ceci

Function ControleSomme() As Boolean

t = Array("TxtCopeaux", "TxtPreventif", "TxtReglages", "TxtAttente", "TxtPannes")

With FormaulaireOpe
    For Each ctl In FormulaireOpe.Controls
        For i = LBound(t) To UBound(t)
            If ctl.Name = t(i) Then
                Somme = Somme + ctl.Value * 1
                Exit For
            End If
        Next i
    Next ctl
End With

If Somme > 8 Then
    MsgBox "La somme est supérieure à 8", vbCritical, "Validation de saisie"
Else
    ControleSomme = True
End If

End Function

Mais j'ai une erreur "incompatibilité de type sur la ligne

Somme = Somme + ctl.Value * 1

je ne comprend pas d'où elle peut provenir

Oui, vous avez compris, sinon, on n'aurait pas passer le If .

Pouvez-vous essayer ceci :

Function ControleSomme() As Boolean

dim Somme as double

t = Array("TxtCopeaux", "TxtPreventif", "TxtReglages", "TxtAttente", "TxtPannes")

With FormaulaireOpe
    For Each ctl In FormulaireOpe.Controls
        For i = LBound(t) To UBound(t)
            If ctl.Name = t(i) Then
                Somme = Somme + (replace(ctl.Value, ",", ".") * 1)
                Exit For
            End If
        Next i
    Next ctl
End With

If Somme > 8 Then
    MsgBox "La somme est supérieure à 8", vbCritical, "Validation de saisie"
Else
    ControleSomme = True
End If

End Function

Toutes ces textbox doivent contenir des valeurs numériques.

Cdlt,

Premièrement merci pour le temps que vous consacré à me répondre.

J'ai bien mis le code que vous m'avez proposé mais je crains que ca ne fonctionne pas, j'ai des nombres dont la somme est sup à 8 et je ne voit aucun message

Est-ce que vous pouvez essayer avec :

Function ControleSomme() As Boolean

dim Somme as double, tmsg(1 to 5)

t = Array("TxtCopeaux", "TxtPreventif", "TxtReglages", "TxtAttente", "TxtPannes")

With FormaulaireOpe
    For Each ctl In .Controls
        For i = LBound(t) To UBound(t)
            If ctl.Name = t(i) Then
                n = n + 1
                tmsg(n) = ctl.value
                Somme = Somme + cdbl(ctl.Value)
                Exit For
            End If
        Next i
    Next ctl
End With

msgbox Somme & vblf & vblf & "Valeurs :" & vblf & join(tmsg, " - ")

If Somme > 8 Then
    MsgBox "La somme est supérieure à 8", vbCritical, "Validation de saisie"
Else
    ControleSomme = True
End If

End Function

Pour voir la valeur de Somme et les valeurs des controles.

Attendez, je pense avoir compris d'où vient le problème.

Je met ce code dans le module "routines" mais je n’appelle jamais cette fonction dans mon formulaire. dois-je mettre quelque part "call ControleSomme () " ?

Pourtant, vous aviez bien rencontré une incompatibilité de type ?

L'usage serait d'utiliser cette fonction (comme l'autre validation j'imagine) dans la private sub commandbutton_click de votre userform. A priori, vous allez cliquer pour faire quelque chose mais avant, il y aura ces controles. Ex :

private sub commandbutton_click()

if ControleSomme = false then exit sub

'action à réaliser

end sub

Cdlt,

(Re)bonjour et surement bonne fin de semaine.

En effet j'ai bien une errue d'incompatibilité de type. Mais j'ai également le problème que ma fonction ne s'effectue à aucun moment.

Je vous remet mon fichier car du fait de vos aides il a évolué.

Encore une fois merci d'avance !

Bonjour,

En fait, je pense que vous avez fait des essais avec des cellules vides, d'où l'incompatibilité de type. Et ça s'est produit parce qu'au lieu d'utiliser le résultat de la fonction VerifierFRM, et de quitter la procédure si vraie, elle a été exécutée comme une procédure. Maintenant, on a d'abord le contrôle des cellules vides puis le contrôle de la somme.

Donc, j'ai juste corrigé ça dans le code du bouton OK puis j'ai fait des petites retouches sur les 2 fonctions (annulation des contrôles supplémentaires).

Attention, VerifierFRM renvoie True quand il y a des vides alors que ControleSomme renvoie False quand la somme dépasse 8.

Sinon, j'ai aussi changé la couleur des textbox en atténuant le rouge. Si ça vous plait pas, il suffit de remettre vbred.

En tout cas, le code est très clair, bien organisé, on se retrouve pas avec un module d'Userform totalement saturé, c'est impeccable .

Voici le fichier :

Cdlt,

C'est super merci beaucoup !

Le rouge est en effet bien moins agressif et c'est mieux. Je vais simplement changer le fait que si somme > 8, on puisse tout de même ajouter les valeurs mais que l'opérateur est une msgbox "attention vous avez saisie plus de 8h".

Merci aussi pour le compliment, comme je ne suis pas du tout expert en code j'essaye au moins de le structurer correctement.

Bonne continuation !

Dans ce cas, je propose une msgbox qui laissera le choix à l'utilisateur d'archiver les données ou non :

Function ControleSomme() As Boolean

'code inchangé

If Somme > 8 Then
    reponse = MsgBox("La somme est supérieure à 8. Voulez-vous tout de même archiver la saisie ?", vbyesno + vbexclamation, "Contrôle de saisie")
    if reponse = vbyes then ControleSomme = True
Else
    ControleSomme = True
End If

End Function

Je le pense vraiment, si vous êtes vraiment débutant, vous débutez bien !

Bonne continuation à vous aussi !

Tout est parfait, encore merci.

Je vais essayer de continuer mon apprentissage, VBA est tellement intéressant et pleins de ressources !!!

Rechercher des sujets similaires à "rendre textbox obligatoire remplir"