identification doublons et comptage

erics83

XLDnaute Impliqué
Bonjour,

Je cherche à compter le nombre de doublons d'une série. Très intéressé par les tutos de JB sur le thème des doublons, mais je n'ai pas trouvé comment faire et/ou reproduire...j'ai bien vu qu'il était possible de totaliser, mais je n'arrive pas à le faire par série (=date)...

J'ai une série (par date), je cherche à compter le nombre de numéros communs (=doublons) pour les noms sélectionnés. Je mets en PJ un fichier test.

Merci pour votre aide,

1026739
 

Pièces jointes

  • testcommuns.xlsm
    15.4 KB · Affichages: 13

job75

XLDnaute Barbatruc
Bonjour erics83, Yoyo01000, JHA,

Voyez le fichier joint et cette fonction VBA, à placer impérativement dans un module standard :
VB:
Function NbCommun(v, colRef As Range, plage As Range)
Dim ncol%, c As Range, flag As Boolean, tablo, i%
ncol = plage.Columns.Count
For Each c In colRef
    If c = v Then
        If Not flag Then flag = True: tablo = Intersect(c.EntireRow, plage) '1ère date
        For i = 1 To ncol
            If Application.CountIf(Intersect(c.EntireRow, plage), tablo(1, i)) = 0 Then tablo(1, i) = ""
        Next
    End If
Next
NbCommun = Application.Count(tablo)
End Function
Elle est utilisée dans la feuille de calcul avec cette formule en N2 =NbCommun(M2;A$2:A$13;C$2:I$13)

Nota : je suppose qu'il n'y a pas de doublon de nombres sur une même ligne, dans le cas contraire il faudrait les éliminer.

A+
 

Pièces jointes

  • testcommuns VBA(1).xlsm
    25.8 KB · Affichages: 14
Dernière édition:

job75

XLDnaute Barbatruc
Re, salut eriiiic,

Voici une solution par formule qui nécessite que les dates en colonne A soit triées, en N2 :
Code:
=SOMMEPROD(N(FREQUENCE(DECALER(C$1;EQUIV(M2;A$2:A$13;0);;NB.SI(A$2:A$13;M2);7);DECALER(C$1;EQUIV(M2;A$2:A$13;0);;NB.SI(A$2:A$13;M2);7))=NB.SI(A$2:A$13;M2)))
A+
 

Pièces jointes

  • testcommuns(1).xlsx
    18.4 KB · Affichages: 10

job75

XLDnaute Barbatruc
Fichier (2) avec l'affichage des nombres communs par la fonction VBA matricielle :
VB:
Dim d As Object 'mémorise la variable, ce qui évite de la recréer

Function NbCommun(v, colRef As Range, plage As Range)
Dim ncol%, d As Object, c As Range, flag As Boolean, cc As Range, e, a()
ncol = plage.Columns.Count
If d Is Nothing Then Set d = CreateObject("Scripting.Dictionary") Else d.RemoveAll
For Each c In colRef
    If c = v Then
        If Not flag Then '1ère date
            flag = True
            For Each cc In Intersect(c.EntireRow, plage)
                If cc <> "" Then d(cc.Value) = ""
            Next cc
        End If
        For Each e In d.keys
            If Application.CountIf(Intersect(c.EntireRow, plage), e) = 0 Then d.Remove e
        Next e
    End If
Next c
ReDim a(1) 'base 0
a(0) = d.Count
a(1) = Join(d.keys, "-")
NbCommun = a 'vecteur ligne
End Function
Avec le Dictionary la présence de doublons sur une ligne n'a pas d'importance.
 

Pièces jointes

  • testcommuns VBA(2).xlsm
    27 KB · Affichages: 10

erics83

XLDnaute Impliqué
Bonjour yoyo01000,
Bonjour JHA,
Bonjour eriiiic,
Bonjour job75,

Merci pour toutes vos solutions et propositions, qui m'ont vraiment donné des pistes et surtout des solutions....;)
Merci !

Comme vous vous en doutez mon fichier contient beaucoup plus de lignes (30000 au total), je vais donc faire des essais avec vos différentes propositions (vba ou formules ou matricielles) pour savoir quelle est la plus rapide et/ou plus adaptée à mon besoin.....

Job75, votre proposition du post #4 me semble pour l'instant la plus adaptée, car rapide et sans trop de formules (en fait, par dates il y a 10 noms, et il y a 5000 dates, donc...le temps est une variable dont il faut tenir compte...), serait-il possible d'avoir le résultat sous cette forme ? (en colonne plutôt qu'en ligne ?, j'ai utilisé copier/coller transposé, mais je pense qu'il doit y avoir plus "simple"...), ainsi que le comptage du nombre de Noms ? :

1026777

Grace à vous vous je découvre régulièrement les possibilités (presque infinies, du moins par rapport à mes besoins) de Excel ....Merci !

(et pour ma culture, car j'aime essayer de comprendre les codes....à quoi correspond la variable "flag" et/ou quel est son rôle...Merci,)

En vous remerciant pour votre aide,
Eric
 
Dernière édition:

job75

XLDnaute Barbatruc
Re,

J'ai testé avec un tableau source de 48 000 lignes (12000 dates différentes).

La macro d'eriiiic s'exécute chez moi en 45 secondes, c'est jouable.

Avec la fonction VBA on ne s'en sort pas, j'ai dû quitter Excel par le Gestionnaire des tâches.

Bonne nuit.
 

Discussions similaires

Statistiques des forums

Discussions
312 348
Messages
2 087 508
Membres
103 568
dernier inscrit
NoS