Recherche dans une BD et tri d'une liste par fréquence

  • Initiateur de la discussion Initiateur de la discussion ivan27
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

ivan27

XLDnaute Occasionnel
Bonsoir à tous,

Je cherches à récupérer dans une liste les 20 noms les plus fréquents et/ou les plus récents à fréquence identiques.
Je n'arrive pas à adapter à mon cas le résultat de mes recherches sur le forum.
Merci d'avance pour votre aide.
Je vous communique un fichier explicatif.
Bien cordialement,

Ivan
 

Pièces jointes

Re : Recherche dans une BD et tri d'une liste par fréquence

Bonjour Jacques,

Je viens de tester ta fonction perso mais j'ai le résultat #VALEUR! dans toutes les cellules.
Après vérification, c'est probablement (encore une fois) mon Excel Mac qui ne veut pas des dictionnaires !!!

Ivan
 
Dernière édition:
Re : Recherche dans une BD et tri d'une liste par fréquence

Bonjour ivan27, R@chid, JB,

Avec des tris dans la feuille et des tableaux VBA ce devrait être aussi rapide que le Dictionary :

Code:
Private Sub Worksheet_Activate()
Dim t, rest(), n&, i&
Application.ScreenUpdating = False
With Sheets("BD").[A1].CurrentRegion
  [A2].Resize(.Rows.Count) = .Columns(1).Value 'dates
  [B2].Resize(.Rows.Count) = .Columns(3).Value 'noms
  'tri sur les noms puis décroissant sur les dates
  [A2].Resize(.Rows.Count, 2).Sort [B2], , , [A2], xlDescending, Header:=xlYes
  t = [A2].Resize(.Rows.Count, 2) 'matrice, plus rapide
End With
ReDim rest(1 To UBound(t), 1 To 3)
rest(1, 2) = "NOM": rest(1, 3) = "NOMBRE"
n = 1
For i = 2 To UBound(t)
  If t(i, 2) <> "" Then
    If t(i, 2) <> t(i - 1, 2) Then
      n = n + 1
      rest(n, 1) = t(i, 1) 'date
      rest(n, 2) = t(i, 2) 'nom
      rest(n, 3) = 1 'fréquence
    Else
      rest(n, 3) = rest(n, 3) + 1
    End If
  End If
Next
[A2].Resize(n, 3) = rest
'tri décroissant sur les nombres puis sur les dates
[A2].Resize(n, 3).Sort [C2], xlDescending, , [A2], xlDescending, Header:=xlYes
If n > 21 Then n = 21
[A:A].ClearContents 'mettre en commentaire pour vérifier les dates
Range("A" & n + 2 & ":C" & Rows.Count).Delete xlUp
t = Me.UsedRange 'repositionne la barre de défilement verticale
End Sub
Sur MAC ça ne doit pas poser de problème.

Fichier joint.

Edit : ajouté la dernière ligne pour la barre de défilement.

A+
 

Pièces jointes

Dernière édition:
Re : Recherche dans une BD et tri d'une liste par fréquence

Re,

Avec ceci on peut facilement modifier la cellule des destination :

Code:
Private Sub Worksheet_Activate()
Dim celdest As Range, t, rest(), n&, i&
Set celdest = [B2] 'la cellule qu'on veut...
Application.ScreenUpdating = False
celdest.EntireColumn.Insert 'ajout d'une colonne auxiliaire
With Sheets("BD").[A1].CurrentRegion
  celdest(, 0).Resize(.Rows.Count) = .Columns(1).Value 'dates
  celdest.Resize(.Rows.Count) = .Columns(3).Value 'noms
  'tri sur les noms puis décroissant sur les dates
  celdest(, 0).Resize(.Rows.Count, 2).Sort celdest, , , celdest(, 0), xlDescending, Header:=xlYes
  t = celdest(, 0).Resize(.Rows.Count, 2) 'matrice, plus rapide
End With
ReDim rest(1 To UBound(t), 1 To 3)
rest(1, 2) = "NOM": rest(1, 3) = "NOMBRE"
n = 1
For i = 2 To UBound(t)
  If t(i, 2) <> "" Then
    If t(i, 2) <> t(i - 1, 2) Then
      n = n + 1
      rest(n, 1) = t(i, 1) 'date
      rest(n, 2) = t(i, 2) 'nom
      rest(n, 3) = 1 'fréquence
    Else
      rest(n, 3) = rest(n, 3) + 1
    End If
  End If
Next
With celdest(, 0).Resize(n, 3)
  .Value = rest
  'tri décroissant sur les nombres puis sur les dates
  .Sort celdest(, 2), xlDescending, , celdest(, 0), xlDescending, Header:=xlYes
End With
If n > 21 Then n = 21
celdest(n + 1).Resize(Rows.Count - n - celdest.Row + 1, 2).Delete xlUp
celdest(, 0).EntireColumn.Delete 'mettre en commentaire pour vérifier les dates
t = Me.UsedRange 'repositionne la barre de défilement verticale
End Sub
Fichier (2).

A
 

Pièces jointes

Re : Recherche dans une BD et tri d'une liste par fréquence

Bonsoir à tous et merci pour vos propositions.

Jacques, je te confirme que ta nouvelle version fonctionne sur mon MAC.
Job75, tes propositions sont en parfaite corrélation avec ma demande.
Rachid, désolé pour ma précédente réponse (je n'était pas très bien réveillé) et merci pour ta formule très élaborée et qui correspond à ma demande.

Bien cordialement,

Ivan
 
Re : Recherche dans une BD et tri d'une liste par fréquence

Re,

Juste pour remercier JB de nous avoir montré comment on peut créer avec un module de classe un pseudo Dictionary.

Il serait intéressant de comparer sa durée d'exécution avec le vrai.

Bonne nuit.
 
Re : Recherche dans une BD et tri d'une liste par fréquence

Bonjour à tous,

Je reviens sur ce post pour une demande d'amélioration.
Est-il possible de rajouter une condition à vos propositions et de récupérer uniquement la liste des noms pour lesquels la valeur en colonne D est différente de "NON".
Bien cordialement et bon dimanche.
Ivan
 

Pièces jointes

Re : Recherche dans une BD et tri d'une liste par fréquence

Bonjour le fil, le forum,

J'ai copié le tableau de la feuille "BD" jusqu'à la ligne 34001.

Sur Win XP - Excel 2003 voici les durées d'exécution :

- macro de job75 post #10 => 0,86 seconde

- fonction de JB avec pseudo Dictionary => 1,56 seconde

- fonction de JB avec vrai Dictionary => 0,28 seconde

A+
 
Re : Recherche dans une BD et tri d'une liste par fréquence

Bonjour,

Fonction FrequenceTexte() correspondant à la fonction Frequence() (intervalle numérique)

Code:
Function FrequenceTexte(champ As Range)
  Set d1 = CreateObject("Scripting.Dictionary")
  d1.CompareMode = vbTextCompare
  temp = champ
  For i = LBound(temp) To UBound(temp)
    c = temp(i, 1)
    If c <> "" Then   d1(c) = d1(c) + 1
  Next i
  Dim b()
  ReDim b(1 To d1.Count, 1 To 2)
  i = 1
  For Each c In d1.keys
    b(i, 1) = c: b(i, 2) = d1(c)
    i = i + 1
  Next
  Call tri(b, 1, d1.Count)
  FrequenceTexte = b
End Function

JB
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour