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 sub

il apparait une anomalie à la ligne :

If Application.CountIf(Range(Cells(21, Target.Column), Cells(20060, Target.Column)), Target) > 1 Then

que 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 sub

Bonsoir,

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 Sub

bonsoir

ton explication reflete parfaitement le comportement du code !!!!! c'est excatement ca te remerciant pour la solution que tu propose

cordialement ,Rocket

Rechercher des sujets similaires à "comprehension ligne code"