Compréhension d'une ligne de code
bonsoir
disposant du code suivant :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("B22:B20060"), Target) Is Nothing Then
If Application.CountIf(Range(Cells(21, Target.Column), Cells(20060, Target.Column)), Target) > 1 Then
MsgBox "selection deja faite"
Target.ClearContents
End If
End If
End subil apparait une anomalie à la ligne :
If Application.CountIf(Range(Cells(21, Target.Column), Cells(20060, Target.Column)), Target) > 1 Thenque j'essaie de corriger sans succès , si je comprend bien ce code ont selectionne dans la plage b22 à b20060 une cellule et si cette selection à deja été faite un message box apparait et affiche " selection deja faite"
pourriez vous m'aiguiller ? merci
re.... j'avais oublié de preciser que la ligne de code surligné renvoi le message erreur 13 "incompatibilité de type"
est que la correction suivante est adequate ?
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("B22:B20060"), Target) Is Nothing Then
If Application.CountIf(Range [b]val[/b](Cells(21, Target.Column), Cells(20060, Target.Column)), Target) > 1 Then
MsgBox "selection deja faite"
Target.ClearContents
End If
End If
End subBonsoir,
A priori ce code fait ceci:
si une valeur est modifiée sur la feuille:
1) si la cellule modifiée fait partie de la zone B22:B20060
2) compte le nombre de cellules de la zone B21:B20060 qui sont égales à la valeur de la cellule modifiée
3) si ce nombre est supérieur ou égal à 2 (cela signifie que la valeur de la cellule modifiée existe déjà dans la zone B21:B20060)
alors remet la cellule à vide et avertit l'utilisateur.
si ce nombre est inférieur ou égal à 1 (cela signifie que la valeur de la cellule modifiée n'existe pas encore dans la zone B21:B20060)
alors conserve la valeur de la cellule.
Autrement dit, on n'autorise dans la zone B22:B20060 que la saisie de valeurs qui n'existent pas encore dans cette zone. On veut garantir l'unicité des valeurs de cette zone.
Ce code fonctionne si une seule cellule est modifiée. Par contre si plusieurs cellules sont modifiées simultanément, alors une erreur se produit, sans doute au niveau de : Application.CountIf(Range(Cells(21, Target.Column), Cells(20060, Target.Column)), Target) > 1
Car on a pré-supposé qu'une seule cellule pouvait être modifiée à la fois.
Si on modifie plusieurs cellules en même temps (par exemple on saisit "1" en B22 puis "2" en B23, on sélectionne B22:B23 puis on fait une copie incrémentée vers le bas) alors la procédure échoue.
Pour éviter cela on peut faire une boucle sur l'ensemble des valeurs modifiées:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim xCell As Range
If Not Intersect(Range("B22:B20060"), Target) Is Nothing Then
For Each xCell In Intersect(Range("B22:B20060"), Target).Cells
If Application.CountIf(Range(Cells(21, xCell.Column), Cells(20060, xCell.Column)), xCell) > 1 Then
MsgBox xCell.Value & " existe déjà dans : " & Range(Cells(21, xCell.Column), Cells(20060, xCell.Column)).Address(False, False)
xCell.ClearContents
End If
Next xCell
End If
End Subbonsoir
ton explication reflete parfaitement le comportement du code !!!!!
cordialement ,Rocket