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

eriiic

XLDnaute Barbatruc
Reste à voir la volumétrie, et comment est utilisé le fichier.
S'il est enrichi tous les jours et qu'il faut le mettre à jour, une fonction peut rester intéressante.
Si c'est trié par date comme on peut le supposer, on peut restreindre la plage passée au nécessaire avec un Equiv() et un Nb.Si().
Ca ne fera qu'un tout petit bloc à lire en une fois. Là tu lis cellule par cellule, ça la dessert.
A voir selon l'usage, si c'est en une fois ponctuellement ou non.
eric
 

erics83

XLDnaute Impliqué
Merci job75,
Merci eriiiic,

Effectivement, c'est un tableau qui va être alimenté hebdomadairement...
Je n'ai pas encore pu faire les tests de rapidité car j'ai commencé à refaire ma base suivant vos conseils : tris, etc...

je reviens vers vous avec les résultats.

Merci à vous deux ;)
 

erics83

XLDnaute Impliqué
Merci eriiiic,
J’ai oublié de mettre à jour mon post...c’est bon, j’avais réussi à mettre en horizontal...me permettant de comparer les 2 vitesses d’exécution avec le même format...
Je retravaille ma base afin d’alléger au maximum et je vais faire tourner les 2 possibles (job75 et toi)...
Je post dès que j’ai tous les résultats
Merci pour ton aide
 

eriiic

XLDnaute Barbatruc
J'ai aussi mis le nombre de noms à la place de la liste des communs.
Par contre j'ai considéré que pour une même date tous les noms étaient différents comme sur ton exemple.
Si un nom peut revenir plusieurs fois pour une même date il faudra ajouter un dictionary.
eric
 

erics83

XLDnaute Impliqué
Ok,

Merci eriiiic, je suis rentré et suis devant mon PC, je regarde et continue de mettre ma base à jour....

Merci pour ton aide,

ps edit : j'ai supprimé un de mes post par inadvertance....je disais à eriiiic que j'allais faire un mix entre son code et un code de JB sur les recherches....

Eric
 
Dernière édition:

eriiic

XLDnaute Barbatruc
2 oublis : sauter les 'vide' (peut fausser un résultat), et un Redim Preserve (sans impact)
VB:
Sub dblCommun()
    Dim datas, result, dat As Date, dict, nbNom As Long
    Dim lig1 As Long, col2 As Long, col As Long, cpt As Long, k
    datas = [A2:I2].Resize(Cells(Rows.Count, 1).End(xlUp).Row).Value
    ReDim result(1 To 3, 1 To UBound(datas))
    For lig1 = 1 To UBound(datas)
        nbNom = nbNom + 1
        If datas(lig1, 1) <> dat Then
            If lig1 <> 1 Then
                col2 = col2 + 1
                result(3, col2) = nbNom - 1
                nbNom = 1
                For Each k In dict.keys
                    If dict(k) <> cpt Then dict.Remove k
                Next k
                result(1, col2) = dat
                result(2, col2) = dict.Count
            End If
            Set dict = Nothing
            Set dict = CreateObject("Scripting.Dictionary")
            dat = datas(lig1, 1)
            cpt = 0
        End If
        cpt = cpt + 1
        For col = 3 To 8
            If datas(lig1, col) <> "" Then
                If dict.exists(datas(lig1, col)) Then
                    dict(datas(lig1, col)) = dict(datas(lig1, col)) + 1
                Else
                    dict(datas(lig1, col)) = 1
                End If
            End If
        Next col
    Next lig1
    Set dict = Nothing
    ReDim Preserve result(1 To 3, 1 To col2)
    [M1].CurrentRegion.Offset(, 1).ClearContents
    [N1:N3].Resize(3, UBound(result)) = result
End Sub
 

eriiic

XLDnaute Barbatruc
Oui, et ?
Crée un tableau qui ressemble à ce que tu as demandé si tu veux utiliser la macro, ou sinon adapte le code.
J'ai l'impression que c'est à partir de R:AC.
A part que les dates ne sont plus des dates et que le nombre de colonnes est supérieur.

Les courses ce n'est pas mon dada, mais je me demande comment le fait savoir que un ou des pronostiqueurs ont trouvé 2 chevaux pourrait t'aider...
Surtout en comparant un pronostiqueur qui en liste 3 avec un autre qui en liste 8 (sur 9 partants...). Le 2nd a plus de chance d'en trouver mais n'en sera pas meilleur pour autant.
Bref, bonne chance aux courses :)
eric
 

erics83

XLDnaute Impliqué
Les courses ce n'est pas mon dada
:D

Oui, j'ai du adapter les dates (car à u moment je suis passé par des TCD, donc plus facile à gérer), celui qui en liste 3 n'est pas un pronostiqueur en fait, c'est l'arrivée des chevaux et comme j'essaye d'identifier les numéros communs, j'ai mis l'arrivée en pronostiqueur N°10....et concernant les pronostiqueurs, tu as pu voir qu'il y a des combinaisons qui vont jusque comparer 5 pronostiqueurs, donc je me disais que cela pourrait être intéressant de voir les "bonnes" combinaisons...

merci pour tes encouragements ;)
Merci pour ton aide,
Eric
 

job75

XLDnaute Barbatruc
Bonjour erics83, eriiiic,

Voici une solution par fonction VBA avec un tableau source de 48 000 lignes :
VB:
Public d As Object, dd As Object 'variables mémorisées

Function NbCommun(dat As Date)
Dim adr$, a&(1 To 2, 1 To 1)
adr = Cells(d(dat), 3).Resize(dd(dat), 7).Address
a(1, 1) = Evaluate("SUM(N(FREQUENCY(" & adr & "," & adr & ")=" & dd(dat) & "))")
a(2, 1) = dd(dat)
NbCommun = a
End Function
Comme on le voit elle utilise la formule Excel avec FREQUENCE de mon post #6.

Cela nécessite donc que les dates en colonne A soient triées.

Le calcul des 12000 formules en lignes 2 et 3 de la feuille ne prend que 5 secondes chez moi.

Les 2 Dictionary sont recalculés chaque fois que l'on modifie la feuille, cela ne prend que 0,35 seconde :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim tablo, i&, x
With [A1].CurrentRegion
    .Sort .Columns(1), xlDescending, Header:=xlYes 'tri
    tablo = .Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
End With
Set d = CreateObject("Scripting.Dictionary")
Set dd = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
    x = tablo(i, 1)
    If Not d.exists(x) Then d(x) = i
    dd(x) = dd(x) + 1
Next
End Sub
Dans ce fichier (4) un bouton permet le recalcul des formules.

A+
 

Pièces jointes

  • testcommuns VBA(4).xlsm
    1.8 MB · Affichages: 13

erics83

XLDnaute Impliqué
Merci job75, effectivement, très impressionnant !!!

J'essaye de mettre une formule complémentaire en ligne 4 : si ligne 3 = 3 then ligne =1 else ligne 4 =0 pour toutes les colonnes....car en fait, c'est le total des colonnes qui m'interesse au final : pour la ligne 2, si le total est 2, je compte 1 et si ligne3=3 je compte 1....
Je pense que c'est possible.....je pense que c'est avec a(3, 1) que se trouverait la solution....mais ...je n'arrive pas....j'ai fait
VB:
if a(2, 1) = 3 then a(3, 1)=1 else a(3,1)=0
'en changeant aussi le tableau Dim adr$, a&(1 To 2, 1 To 1) en Dim adr$, a&(1 To 3, 1 To 1)'

Et cela ne fonctionne pas....je sais que c'est le a(.,.) qui pose problème, mais je ne vois pas comment l'écrire....

Je sais qu'en rajoutant une formule dans ma feuille, c'est très possible, mais si déjà on est dans les tableaux, je pense que cela est faisable....mais comment ?

Merci pour votre aide,
 

Discussions similaires

Statistiques des forums

Discussions
312 198
Messages
2 086 145
Membres
103 130
dernier inscrit
FRCRUNGR