VBA Excel : Question concernant validation de champs de formulaire

Bonjour à tous,

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 :

  1. Transformer ton tableau en feuille SaisieListeProduits en tableau structuré
  2. 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 Function

Pour 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 Sub

2. 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 Sub

Seulement, 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 Sub

Ce 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.

Rechercher des sujets similaires à "vba question concernant validation champs formulaire"