Validation de donnée en interdisant * et cellule vide

jack.r

XLDnaute Nouveau
Dans une feuille Excel, J'ai un grand nombre de cellule qui doivent contenir uniquement A? B, C, E, E ou F.
Afin de faciliter la saisie, dans une autre feuille, j'ai créé et nommé la liste des valeurs.
Sur les cellules voulues, j'ai fait une validation de donnée en utilisant une liste avec pour source ma plage nommée.
En VBA, afin de forcer les majuscules, j'ai rajouté
Private Sub Worksheet_Change(ByVal Target As Range)
Cells(Target.Row, Target.Column) = UCase(Target.Value)
End Sub

Lorsque l'on effectue la saisie au clavier, si on tape * ou la touche suppr, il n'y a pas d'erreur de saisie alors que je souhaite limiter de façon exlusive la saisie à ma liste.

Comment empêcher ces saisies "erronnées" ?
 

tototiti2008

XLDnaute Barbatruc
Re : Validation de donnée en interdisant * et cellule vide

Bonjour jack.r

Bienvenue sur XLD,

Au niveau de la validation de données, tu peux interdire la saisie hors liste dans l'onglet Alerte d'erreur
Cocher "Quand des données non valides sont tapées", Style Arrêt
 

jack.r

XLDnaute Nouveau
Re : Validation de donnée en interdisant * et cellule vide

Au niveau de la validation de données, tu peux interdire la saisie hors liste dans l'onglet Alerte d'erreur
Cocher "Quand des données non valides sont tapées", Style Arrêt

C'est déjà le cas mais cela n'empêche pas la saisie de * ou d'une cellule vide.
Si je tape une touche non prévue j'ai bien le message.
Si je tape * ou supprime une valeur valide puis appuye sur Entrée, là je n'ai pas d'alerte
 

jack.r

XLDnaute Nouveau
Re : Validation de donnée en interdisant * et cellule vide

Bonjour,

N'ayant pas trouvé de solution simple pour limiter strictement à une liste (je ne veux pas autoriser * ou un cellule vide), j'ai fait un peut de VBA

Sur les cellules concernées, la validation est mise à liste, la source est "=Usure". Message de saisie et alerte d'erreur
sont désactivés (on fait tout nous même)

La plage nommée Usure se trouve en colonne G sur la feuille Valeurs et est défini par
=DECALER(Valeurs!$G$2;;;NBVAL(Valeurs!$G:$G)-1)

Si dessous le code.
En pièce jointe, un fichier exemple.

A+


ThisWorkbook
============
Code:
Option Explicit

Private Sub Workbook_Open()
    Init
End Sub

Feuille Demo
============
Code:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Valeur As String
    
    If ValeurValide(LastColumn, LastRow) Then
        If (Not Intersect(Target, Range("B2:B8")) Is Nothing) Or _
            (Not Intersect(Target, Range("C2:C6")) Is Nothing) Then
            ' Store new position
            LastColumn = Target.Column
            LastRow = Target.Row
            LastColor = Target.Interior.ColorIndex
        End If
    End If
End Sub

Module Engine
=============
Code:
Option Explicit

Const CarAutorises = "A,B,C,D,E"
Public LastColumn As Long
Public LastRow As Long
Public LastColor As Long

Public Function Init()
    Dim Ligne As Long
    Dim Valeurs As Variant
    Dim Valeur As Variant
    
    Sheets("Valeurs").Select
    Columns("G:G").Select
    Selection.ClearContents
    Range("G1").Value = "Usure"
    
    Valeurs = Split(CarAutorises, ",")
    Ligne = 2
    For Each Valeur In Valeurs
        Range("G" & Ligne).Value = Valeur
        Ligne = Ligne + 1
    Next
    Range("G1").Select
    Sheets("Demo").Select
    
    LastColumn = 0
    LastRow = 0
End Function

Public Function ValeurValide(NewColumn, NewRow As Long)
    Dim Valeur As String
    Dim Result As Boolean
    Dim Reponse As String
    
    Result = True
    ' Verify old position
    If ((LastColumn > 0) And (LastRow > 0)) Then
        Valeur = UCase(Left(Trim(Cells(LastRow, LastColumn).Value), 1))
        If ((Valeur = "") Or _
            (Valeur = ",") Or _
            (InStr(1, CarAutorises, Valeur) = 0)) Then
            Application.EnableEvents = False
            Cells(LastRow, LastColumn).Select
            Cells(LastRow, LastColumn).Interior.ColorIndex = 38
            Application.EnableEvents = True
            Reponse = MsgBox("Seuls " & CarAutorises & " sont autorisés", _
                vbOKOnly, "Erreur de saisie", "", 0)
            Result = False
        Else
            Cells(LastRow, LastColumn) = Valeur
            Cells(LastRow, LastColumn).Interior.ColorIndex = LastColor
        End If
    End If
    ValeurValide = Result
End Function
 

Pièces jointes

  • tst_validation.xls
    36 KB · Affichages: 106

Discussions similaires

Statistiques des forums

Discussions
312 514
Messages
2 089 216
Membres
104 066
dernier inscrit
il matador