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.