XL 2010 VBA : détection de doublons

spike29

XLDnaute Occasionnel
Bonjour,

Je travail sur un tableau qui gère des groupes (chacun constitués de deux colonnes).
La quantité de groupes est variable et en évolution permanente.

J'ai récupéré une macro qui me permet de détecter les doublons dans la première colonne de chaque groupe.
Elle colore les cellules en double, triple... puis les comptabilises.

Etant novice en VBA, j'aurais besoin d'un coup de pouce pour l'adapter.
Cette macro fonctionne parfaitement mais je souhaiterai l'adapter à mes besoins :

- Inscrire le libellé des doublons en haut de la 2ème colonne du groupe
- Permettre d'élargir cette macro à l'ensemble des groupes présents dans la feuil1
- Si l'utilisateur rajoute un groupe, la macro doit également fonctionner sans adaptation

Je vous joint mon fichier avec les explications qui vont bien.


Merci d'avance pour vos retours et bon weekend de Pâques à tous !
 

Pièces jointes

  • testdoublons.xlsm
    23.1 KB · Affichages: 9

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @spike29,

Avec une fonction personnalisée écrite en VBA: =DoublonNBrListe(xrg , opt)
  • xrg est la plage à examiner
  • opt est facultatif: Si opt est absent, alors on affiche le nombre de doublon. Si opt est présent (et dans ce cas, il peut valoir n'importe quoi), alors on affiche la liste des doublons.
les formules en C3: D3 sont à copier/tirer vers la droite.

Pour colorier les cellules des doublons, on a utilisé une MFC sur la plage C4:N20, avec pour formule:
=ET(NB.SI(C$4:C4;C4)>1;EST.IMPAIR( COLONNES($C:C))) .

Le code de la fonction est dans module1:
VB:
Function DoublonNBrListe(xrg As Range, Optional opt)
Dim dic As New Dictionary, x, n&, s
   Set dic = CreateObject("scripting.dictionary"): dic.CompareMode = TextCompare
   For Each x In xrg: dic(CStr(x)) = dic(CStr(x)) + 1: Next
   If IsMissing(opt) Then
      For Each x In dic
         If dic(x) > 1 Then n = n + dic(x) - 1
      Next x
      DoublonNBrListe = n
   Else
      For Each x In dic
         If dic(x) > 1 Then s = s & "," & x
      Next x
      DoublonNBrListe = Mid(s, Len(",") + 1)
   End If
End Function
 

Pièces jointes

  • spike29- test doublons- v1.xlsm
    22.8 KB · Affichages: 10

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Staple1600 :),
Cocher la référence idoine* dans VBE, si DoublonNBrListe est utilisé dans un autre classeur.
Il est vrai que pendant la phase de rédaction du code, je fais uniquement référence à la bibliothèque congrue pour bénéficier de l'auto-complétude à la frappe. On va donc trouver à la fois le "as new Dictionary" dans la déclaration et le "createObject(...)" dans le code. Neuf fois sur dix, j'oublie de l'ôter quand le travail est fini.
Ben du coup, j'ai retiré le "as new Dictionary". Donc, je ne coche plus.

C'est tellement calme et immobile aussi bien dehors qu'à l'intérieur, que même faire la sieste semble être une agitation physique et intellectuelle :p.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

mapomme
Pronostic ?
(sans VBA, sans formule)
1) I want to break free!
ou
2) capot ? (aka G.G remix: I will confine)

Oh no, not I, I will confine
Oh, as long as I know how to love, I know I'll stay alive
I've got all my needs to live
And I've got all my cells to give and I'll confine
I will confine, hey, hey
;)
 

spike29

XLDnaute Occasionnel
Un grand merci à tous les deux pour votre aide aussi rapide qu'efficace.

@mapomme ton code fonctionne parfaitement.

Petite précision qui n'apparaît pas forcément dans ma demande initiale.
La quantité de colonnes comme leurs profondeur peuvent être variables (bien que je m'arrêtais à la ligne 20 dans mon fichier test).

Conséquence, si des cellules vides sont détectées dans la plage de sélection cela est automatiquement comptabilisé comme doublon.

Est-il possible d'intégrer dans le code de ta fonction la condition suivante :
Si cellule vide dans la plage de sélection passer à la cellule suivante sans faire +1 au compteur des doublons.

J'ai essayer de "bricoler" un peu pour intégrer cela à ton code mais sans succès.
Code qui est bien au dessus de mes maigres connaissances en VBA.

For Each x In dic
If xrg = "" Then n = 0
Next x
DoublonNBrListe = n


Bonne fin de journée et merci encore
 

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 321
Membres
102 862
dernier inscrit
Emma35400