VBA Excel : Question concernant validation de champs de formulaire
je suis en train de travailler sur un formulaire de saisie de données Excel.
J'aimerais pouvoir conditionner la validation de certains champs.
Notamment :
1. Empêcher les doublons sur un champ "Référence"
2. Empêcher la saisie d'une valeur incorrecte par rapport à la valeur d'un autre champs.
J'ai trouvé des solutions, mais tout ne marche pas encore comme je le voudrais.
Je demande un peu d'aide, merci
Ci-joint mon fichier.
Bonjour Raymond, bonjour le forum,
Je ne comprends pas pourquoi :
1. tu utilises deux bases de données, qui semblent être similaires en plus.
2. tu veux interdire les doublons et ta base commence par un doublons avec la référence A0001 (je n'ai pas vérifié s'il y en avait d'autres).
Et quand je ne comprends pas, je ne peux pas me lancer dans une recherche de solution...
Bonjour, ce doublon de référence fait suite à un essai
Si tu vois 2 bases, c’est parce que je dois faire un transfert, d’un tableau vers un autre pour pouvoir manipuler les données et les exporter vers un format similaire à du txt.
merci
Salut,
1. Empêcher les doublons sur un champ "Référence"
Pour cela :
- Transformer ton tableau en feuille SaisieListeProduits en tableau structuré
- Faire une recherche de la référence si pas trouvée tu ajoutes une ligne, sinon tu édites la ligne.
Voici une fonction qui renvoie une ligne d'un tableau structuré par rapport à une recherche
' // GetListRow By Pierre Fauconnier le : 16/01/2022
' // Retourne une ligne d'un tableau depuis la recherche d'une valeur dans une colonne
' // https://www.developpez.net/forums/blogs/27262-pierre-fauconnier/b5879/excel-vba-modifier-donnees-tableau-formulaire/
Function TS_GetListRow(Table As ListObject, ColumnName As String, Value As Variant) As ListRow
Dim Formula As String
Dim Index As Long
If TypeName(Value) = "String" Then Value = """" & Value & """" Else Value = Value * 1
Formula = "iferror(match({value},{table}[{column}],0),0)"
Formula = Replace(Formula, "{value}", Value)
Formula = Replace(Formula, "{table}", Table.Name)
Formula = Replace(Formula, "{column}", ColumnName)
Index = Evaluate(Formula)
If Index > 0 Then Set TS_GetListRow = Table.ListRows(Index)
End FunctionPour l'appel tu fais depuis la macro du bouton valider
Private Sub BtnValidate_Click()
Dim lstO As ListObject
Dim lstR As ListRow
' // On présume que tu a créé un tableau en Feuille (Ajouter)
Set lstO = Range("Tableau1").ListObject
Set lstR = TS_GetListRow(lstO, "Référence", Me.Référence)
If Not lstR Is Nothing Then
FillListRow lstR
Else
Set lstR = lstO.ListRows.Add
FillListRow lstR
End If
If Not lstO Is Nothing Then Set lstO = Nothing
If Not lstR Is Nothing Then Set lstR = Nothing
End Sub
Sub FillListRow(ListeR As ListRow)
With ListeR
.Range(1) = Me.LonguerPanneau
.Range(2) = Me.LargeurPanneau
.Range(3) = Me.EpaisseurPanneau
'...
'...
End With
End Sub2. Empêcher la saisie d'une valeur incorrecte par rapport à la valeur d'un autre champs.
Là il nous faut plus d'indications
Bonjour à tous,
merci Jean-Paul pour le code
Concernant "Empêcher la saisie d'une valeur incorrecte par rapport à la valeur d'un autre champs.", en fait je voudrais simplement empêcher de saisir une valeur "Largeur" plus grande que la valeur "Longueur".
J'avais écrit ceci :
Private Sub LargeurPanneau_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'Action à la saisie de LongueurPanneau pour calcul Positions Y Traverses
'Envoi de la valeur dans la feuille XLS ListeProduits
If Me.LargeurPanneau.Value > Me.LongueurPanneau.Value Then
' Si LargeurPanneau > LongueurPanneau : Affichage texte
Me.LblMessage = "La largeur ne peut pas être plus grande que la longueur, corrigez SVP !"
Else
' Si valeur non trouvée, effacer le texte et quitter
Me.LblMessage = ""
End If
End SubSeulement, dans certains cas, le message d'erreur s'affiche malgré que les valeurs sont ok.
De plus, en cas de saisie erronée, je voudrais faire SetFocus du champ "LargeurPanneau" avec sélection du texte saisi, mais je n'y suis pas arrivé non plus.
Merci
Bonjour à tous,
en bossant un peu, je suis arrivé à ce résultat :
Private Sub LongueurPanneau_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Val(Me.LongueurPanneau) < 600 Or Val(Me.LongueurPanneau) > 1600 Then
' Si LargeurPanneau < 600 ou > 1600: message d'erreur
Me.LblMessage = "La valeur doit être comprise entre 600 et 1600, corrigez SVP !"
Me.LongueurPanneau = ""
Cancel = True
ElseIf Val(Me.LongueurPanneau) = 0 Then
Me.LblMessage = ""
' Si LongueurPanneau vide : message d'erreur
Me.LblMessage = "Longueur nulle interdite, corrigez SVP !"
Cancel = True
Else
Me.LblMessage = ""
' Sinon : Calcul valeurs traverses
Me.Y_Traverse_1.Value = Round(Me.LongueurPanneau * 0.25, 0)
Me.Y_Traverse_2.Value = Round(Me.LongueurPanneau * 0.5, 0)
Me.Y_Traverse_3.Value = Round(Me.LongueurPanneau * 0.75, 0)
End If
End Sub
Private Sub LargeurPanneau_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Val(Me.LargeurPanneau) = 0 Then
' Si LargeurPanneau vide : message d'erreur
Me.LblMessage = "Lageur nulle interdite, corrigez SVP !"
Me.LargeurPanneau = ""
Cancel = True
ElseIf Val(Me.LargeurPanneau) > Val(Me.LongueurPanneau) Then
Me.LblMessage = ""
' Si LargeurPanneau > LongueurPanneau : message d'erreur
Me.LblMessage = "La largeur ne peut pas être plus grande que la longueur, corrigez SVP !"
Cancel = True
ElseIf Val(Me.LargeurPanneau) < 400 Or Val(Me.LargeurPanneau) > 1000 Then
Me.LblMessage = ""
' Si LargeurPanneau < 400 ou > 1000: message d'erreur
Me.LblMessage = "La valeur doit être comprise entre 400 et 1000, corrigez SVP !"
Me.LargeurPanneau = ""
Cancel = True
End If
End SubCe n'est certainement pas la méthode la plus simple, mais ça fonctionne !!
Je fais avec mes compétences en VBA Excel !
Merci quand même.
Salut,
Oui c'est une solution, moi je préfère les Select Case mais ça n'engage que moi.
Mets aussi un With Me ..... End with pour enlever tous les Me.