Protection de deux listes déroulantes d'une feuille contre copier coller

Bonjour,

J'ai une feuille qui contient deux colonnes Emploi et Poste dont les cellules sont des listes déroulantes (chaque liste se trouve dans une feuille séparée).

Je veux protéger ces deux colonnes du copier_coller d'une valeur qui ne se trouve pas sur la liste déroulante et qui vient l'écraser.

Pour protéger la première colonne Emploi, j'ai réussi à le faire grâce à un code récupéré du forum que je mets en bas. Toutefois, pour l'appliquer sur la deuxième colonne, le code ne fonctionne pas. J'ai mis le même code après le premier en changeant les références aux colonnes et aux listes déroulantes.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 And Not Intersect(Target, Range("F3:F447")) Is Nothing Then
        ' on arrête la surveillance événementielle pendant l'excécution du code
        Application.EnableEvents = False
        ' on fait juste un UNDO pour revenir en arrière
        Application.Undo
        ' on remet la surveillance événementielle en marche
        Application.EnableEvents = True
        Exit Sub
    End If
    If Not Intersect(Target, Range("F3:F447")) Is Nothing Then
        ' on arrête la surveillance événementielle pendant l'excécution du code
        Application.EnableEvents = False
        ' on définie une variable objet Range
        Dim C As Range
        ' avec la feuille 2
        With Sheets(2)
            'on attribue à C la cellule de la liste de choix correspondant à la valeur de la cellule A1
            Set C = Sheets("Emploi").Range("Emploi").Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole)
            ' s'il y a bien une cellule d'attribuée, c'est que la valeur est "valide"
            If Not C Is Nothing Then
                ' on vide la mémoire de C
                Set C = Nothing
                ' dans le cas où la bonne valeur vienne d'un copier coller et qui peut
                ' avoir effacer la validation de données
                With Target.Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                    xlBetween, Formula1:="=Emploi"
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .InputTitle = ""
                    .ErrorTitle = ""
                    .InputMessage = ""
                    .ErrorMessage = ""
                    .ShowInput = True
                    .ShowError = True
                End With
                ' on remet la surveillance événementielle en marche
                Application.EnableEvents = True
                ' on sort du code
                Exit Sub
            ' si C est vide alors la valeur ne fait pas partie de la liste de choix
            Else
                ' on fait juste un UNDO pour revenir en arrière
                Application.Undo
            End If
        ' on a fini avec la feuille 2
        End With
        ' on remet la surveillance événementielle en marche
        Application.EnableEvents = True
    ' fin du premier if
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 And Not Intersect(Target, Range("G3:G447")) Is Nothing Then
        ' on arrête la surveillance événementielle pendant l'excécution du code
        Application.EnableEvents = False
        ' on fait juste un UNDO pour revenir en arrière
        Application.Undo
        ' on remet la surveillance événementielle en marche
        Application.EnableEvents = True
        Exit Sub
    End If
    If Not Intersect(Target, Range("G3:G447")) Is Nothing Then
        ' on arrête la surveillance événementielle pendant l'excécution du code
        Application.EnableEvents = False
        ' on définie une variable objet Range
        Dim C As Range
        ' avec la feuille 2
        With Sheets(2)
            'on attribue à C la cellule de la liste de choix correspondant à la valeur de la cellule A1
            Set C = Sheets("Poste").Range("Poste").Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole)
            ' s'il y a bien une cellule d'attribuée, c'est que la valeur est "valide"
            If Not C Is Nothing Then
                ' on vide la mémoire de C
                Set C = Nothing
                ' dans le cas où la bonne valeur vienne d'un copier coller et qui peut
                ' avoir effacer la validation de données
                With Target.Validation
                    .Delete
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
                    xlBetween, Formula1:="=Poste"
                    .IgnoreBlank = True
                    .InCellDropdown = True
                    .InputTitle = ""
                    .ErrorTitle = ""
                    .InputMessage = ""
                    .ErrorMessage = ""
                    .ShowInput = True
                    .ShowError = True
                End With
                ' on remet la surveillance événementielle en marche
                Application.EnableEvents = True
                ' on sort du code
                Exit Sub
            ' si C est vide alors la valeur ne fait pas partie de la liste de choix
            Else
                ' on fait juste un UNDO pour revenir en arrière
                Application.Undo
            End If
        ' on a fini avec la feuille 2
        End With
        ' on remet la surveillance événementielle en marche
        Application.EnableEvents = True
    ' fin du premier if
    End If
End Sub

Prière de m'aider à résoudre ce problème. J'utilise VBA pour la première fois.

Merci beaucoup

Bonjour,

voir ici:

https://forum.excel-pratique.com/viewtopic.php?f=2&t=87862

la proposition de LouReeD

Merci i20100. La proposition de LouReed marche très bien. Toutefois, je n'ai pas réussi à l'adapter à deux colonnes.

re,

si les colonnes sont sur des feuilles différente,

il faudrait faire la macro sur la page de ThisWorkbook et utiliser l'événement :

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

ainsi tu peux vérifier le nom de feuille et l'adresse (Sh.name et Target.address)

Merci i20100. Mes deux colonnes que je veux protéger sont sur la même feuille. Ce sont les listes sources qui sont chacune sur une feuille séparée.

Rechercher des sujets similaires à "protection deux listes deroulantes feuille contre copier coller"