Microsoft 365 Problème recherche Doublon via macro

ExcLnoob

XLDnaute Occasionnel
Bonjour à tous,

J'ai un petit souci sur une macro qui recherche des doublons dans une colonne (enfin je crois...)
Ci-joint le code :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim Cel As Range

    If Application.WorksheetFunction.CountIf(Range("Q:Q"), Target) > 1 Then
        MsgBox "This invoice number already exists." & Chr(10) & "Please check and modify.", vbCritical, "WARNING !!!"
        Target = ""
        
    End If
    
Exit sub
Le problème est qu'à chaque fois que j'actualise, la macro plante et me mets une incompatibilité de type - Erreur 13 sur la ligne :
If Application.WorksheetFunction.CountIf(Range("Q:Q"), Target) > 1 Then

Alors soit j'ai pas correctement figé le code sur la colonne Q, soit y'a un souci dans le fait qu'il n'y ai pas de doublons, soit je suis complètement à côté de la plaque..

Pourriez-vous m'aider svp ?

Merci.
 
Solution
Bonsoir à tous,

Essayer ce code:
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Intersect(Target, Columns("q:q")) Is Nothing Then Exit Sub
   If Target.Count <> 1 Then Exit Sub
   If Target = "" Then Exit Sub
   If Application.WorksheetFunction.CountIf(Range("Q:Q"), Target) <= 1 Then Exit Sub
   MsgBox "This invoice number already exists." & vbLf & "Please check and modify.", vbCritical, "WARNING !!!"
   Target = "": Target.Select
End Sub

Phil69970

XLDnaute Barbatruc
Bonjour @ExcLnoob

Je te propose ce code pour supprimer es doublon de la colonne Q
*Attention il n'y a pas de message d'avertissement le code supprime juste tous les doublons sur la colonne Q

VB:
Sub Worksheet_Change(ByVal Target As Range)
Dim Derlig&
If Not Application.Intersect(Target, Range("Q:Q")) Is Nothing Then
    Derlig = Cells(Rows.Count, "Q").End(xlUp).Row + 1
    Range("Q1:Q" & Derlig).RemoveDuplicates Columns:=1, Header:=xlYes
End If
End Sub

*Merci de ton retour

@Phil69970
 

ExcLnoob

XLDnaute Occasionnel
Bonsoir @Phil69970
Merci pour ce retour rapide.

Le code marche bien mais comme je le pressentais, il efface tous les doublons. ce qui n'est pas ce que je souhaite faire
Le but est de vérifier si la dernière cellule que je remplis en colonne Q est en doublon dans cette même colonne et de ne supprimer que cette valeur là sans toucher aux autres (et sans me faire buger tout le fichier en prime bien sûr..)

A te lire
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous,

Essayer ce code:
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Intersect(Target, Columns("q:q")) Is Nothing Then Exit Sub
   If Target.Count <> 1 Then Exit Sub
   If Target = "" Then Exit Sub
   If Application.WorksheetFunction.CountIf(Range("Q:Q"), Target) <= 1 Then Exit Sub
   MsgBox "This invoice number already exists." & vbLf & "Please check and modify.", vbCritical, "WARNING !!!"
   Target = "": Target.Select
End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Je limite la procédure à la seule colonne pour que la procédure ne soit pas exécutée quand on modifie des données ailleurs que dans la colonne Q.

On calcule l'intersection entre les cellules modifiées et la colonne Q.
Si cette intersection est vide, alors aucune cellule de la colonne Q n'a été changée, on n'a donc rien à faire donc on quitte la procédure

Maintenant, on est certain qu'il y a des cellules modifiées en colonne Q

On compte le nombre de cellule de target (on aurait pu le faire en premier).
S'il y a plus d'une cellule modifiée alors on ne fait rien et on quitte la procédure

Maintenant, on sait qu'il n'y a qu'une cellule modifiée dans la colonne Q.

Si la cellule modifiée est vide (="") alors on n'a rien a faire (souvent un effacement par l"utilisateur) et on quitte la procédure

Maintenant, on sait qu'il n'y a qu'une cellule modifiée dans la colonne Q et que cette cellule est non vide.

On calcule sa fréquence dans le colonne Q. Si la fréquence est 1, alors on n'a rien à faire et on quitte la procédure

Maintenant, on sait qu'il n'y a qu'une cellule modifiée dans la colonne Q et que cette cellule est non vide. et qu'elle apparait plusieurs fois dans la colonne Q.

On affiche le message, on remet la colonne à vide, on re-sélectionne la cellule modifiée et on quitte la procédure.

ATTENTION!

En mettant la cellule en double à vide (target=""), on modifie la feuille.
On relance donc la procédure évènementielle avant de sortir du premier passage (récurrence).
Mais pour ce 2ème passage, Target est vide donc la deuxième condition fait en sorte qu'on sort immédiatement du 2ème appel de la procédure évènementielle sans rien changer sur la feuille.
On revient donc à l'exécution de la première procédure juste après l'instruction Target="" qui est Target.Select puis on arrive à la fin du premier appel.
 

Discussions similaires

Réponses
2
Affichages
973

Membres actuellement en ligne

Statistiques des forums

Discussions
315 098
Messages
2 116 190
Membres
112 679
dernier inscrit
Yupanki