Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 Compter et classer ordre décroissant éléments dictionary

erics83

XLDnaute Impliqué
Bonjour,

A nouveau inspiré par les excellents tutos de JB, je cherche à compter et classer par ordre décroissant. J'ai pris un classeur test de JB où le but est de créer une liste à partir des éléments d'une colonne séparés par ";", une liste se crée et je cherche à compter le nombre de fois où est "pépé", par exemple et ensuite de classer la liste des sommes par ordre décroissant....

J'ai essayé avec
VB:
 Application.Sum(d1.items)
mais cela ne fonctionne pas....

Merci pour votre aide
 

Pièces jointes

  • TransformeTableauBD2sommedécroissant.xls
    33 KB · Affichages: 9
Dernière édition:

erics83

XLDnaute Impliqué
Merci Lolote83,

Effectivement c'est une piste, mais comme je souhaitais un classement décroissant...et éviter une formule matricielle (qui est très bien au demeurant, mais je '"entraine" avec les Dictionary...).

Merci pour votre aide,
 

dysorthographie

XLDnaute Accro
Bonsoir,
VB:
Sub test()
Const adChar = 129, adInteger = 3
Dim Rs As Object: Set Rs = CreateObject("ADODB.Recordset")
Rs.Fields.Append "Mots-Clefs", adChar, 50
Rs.Fields.Append "NB", adInteger
Rs.Open
 With Rs
For Each c In Range("b2:b" & [b65000].End(xlUp).Row)
    a = Split(c.Value, ";")
 
    For Each m In a
        .Filter = "[Mots-Clefs]='" & Trim(m) & "'"
        If .EOF Then .AddNew
        ![Mots-Clefs] = Trim(m)
        !NB = !NB + 1
        .Update
        .MoveFirst
        Next m
  
  Next c
  .Filter = "": .MoveFirst: .Sort = "NB desc, [Mots-Clefs] ASC"
End With
[E2].CopyFromRecordset Rs
Rs.Close: Set Rs = Nothing
End Sub
 
Dernière édition:

laurent950

XLDnaute Accro
Bonsoir,

Selon le principe Boisgontier

VB:
Sub transforme()
  Set d1 = CreateObject("scripting.dictionary")
  For Each c In Range("b2:b" & [b65000].End(xlUp).Row)
    a = Split(c.Value, ";")
    For Each m In a: d1(Trim(m)) = d1(Trim(m)) + 1: Next m
  Next c
  [E2].CurrentRegion.Offset(1).ClearContents: [F14].ClearContents
  [E2].Resize(d1.Count) = Application.Transpose(d1.Keys)
  [F2].Resize(d1.Count) = Application.Transpose(d1.Items)
  [E2].CurrentRegion.Offset(, 1).Sort key1:=[F2], Order1:=2, Header:=xlYes
  [F14] = Application.Sum(d1.Items)
End Sub
 
Dernière édition:

dysorthographie

XLDnaute Accro
Ici la clé est Mots_Clefs et NB l'item c'est sur NB qu'on trie de façon décroissante! ce que SortedList et ArrayList ne font pas
Mots-ClefsNB
arbre
10​
cloture
10​
fleurs
10​
herbe
10​
Maman
5​
Mamie
5​
Papa
5​
Pépé
5​
chaise
3​
nape
3​
table
3​
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
Bonjour robert
ben un petit tri bulbule alors comme ça vite fait
VBA/Formule matricielle


VB:
Sub test()
    x = in_order_TableauBul([A1:B11].Value, 2)
    [D1].Resize(UBound(x), UBound(x, 2)) = x
End Sub


Function in_order_TableauBul(tabl, col, Optional sens = 0)
    Dim i#, e#, x#
    If TypeName(tabl) = "Range" Then tabl = tabl.Value
    ReDim temp(UBound(tabl, 2))
    For i = 1 To UBound(tabl)
        For e = i + 1 To UBound(tabl)
            Select Case sens
            Case 0
                If tabl(e, col) > tabl(i, col) Then
                    For x = 1 To UBound(tabl, 2): temp(x) = tabl(i, x): tabl(i, x) = tabl(e, x): tabl(e, x) = temp(x): Next
                End If
            Case 1
                If tabl(e, col) < tabl(i, col) Then
                    For x = 1 To UBound(tabl, 2): temp(x) = tabl(i, x): tabl(i, x) = tabl(e, x): tabl(e, x) = temp(x): Next
                End If
            End Select
        Next
    Next
    in_order_TableauBul = tabl
End Function


on peu même des l'ors faire une fonction qui reprendrait le tableau avec les doublons du post 1 et faire tout d'un coup

il y a aussi ma fonction quick sort sur tableau 2 Dim (dans les deux sens ) sur colonne X aussi eventuellement pour les grands tableaux
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…