Recherche & référence DicoCountOrder

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
je vous propose aujourd'hui ma fonction perso "DicoCountOrder"
elle consiste à récupérer une colonne sans doublons mais en comptabilisant les doublons dans un tableau 2 colonnes(chaîne/nombres d’occurrence )
elle fonctionne en formule matricielle(à valider par CTRL+MAJ+ENTER pour les version inférieures à 365)
elle fonctionne aussi en VBA de la même manière
j'ai ajouté la macroOptions description(facultatif)

VB:
Option Explicit
'****************************************************************************************
'collection fonction perso catégorie:texte et tableau
'fonction dictionnaire et count occurence
'auteur :patricktoulon
'date :05/002/2022
'fonctionne en matricielle

'exemple de formule:
'=DicoAndCountOrder(A2:A26)         juste les chaines
'=DicoAndCountOrder(A2:A26)         les chaines et le nombre d'occurrences  sur 2 colonnes  dans l'ordre d'inscription dans le dico
'=DicoAndCountOrder(A2:A26;2;1)     trier par le nombre de récurences décroissant
'=DicoAndCountOrder(A2:A262;2)      trier par le nombre de récurences croissant
'=DicoAndCountOrder(A2:A26;1;2)     trier par ordre alphabétique  croissant
'=DicoAndCountOrde(A2:A26,1,1)      trier par orde alphabétique  décroissant

'toutes les formule  peuvent etre utilise sur une seul colonne
'on aura alors que les chaînes trier selon les formules
 
'la  fonction est accompagné de ma petite fonction tribulle4(tri à bulle)
'****************************************************************************************
Function DicoCountOrder(Source As Variant, Optional colonne_de_tri As Long = 0, Optional sens_du_tri As Long = 0)
'Source est une plage de cellules ou une matrice en base 1
    Debug.Print 1
    Dim nlig&, ncol%, tablo, i&, j%, Dico As Object, K, It
    Set Dico = CreateObject("Scripting.Dictionary")

    Source = Source    'conversion automatique range to variant( c'est tout bète) Merci @Job75
    If Not IsArray(Source) Then MsgBox "cette fonction doit avoir comme source un array2 dim (x ligne et 1 colonne)" & vbCrLf & "ou la colonne d'une plage": DicoCountOrder = "": Exit Function
    nlig = UBound(Source): ReDim tablo(1 To nlig + 3, 1 To 2)

    On Error Resume Next
    ReDim tablo(1 To Application.Caller.Rows.Count + 1, 1 To 2)
    On Error GoTo 0

    For i = 1 To UBound(Source): Dico(Source(i, 1)) = Val(Dico(Source(i, 1))) + 1: Next: K = Dico.keys: It = Dico.items

    For i = 1 To UBound(tablo)
        If i <= (UBound(K) + 1) Then tablo(i, 1) = K(i - 1): tablo(i, 2) = It(i - 1) Else tablo(i, 1) = "": tablo(i, 2) = ""
    Next i
    If sens_du_tri& + colonne_de_tri& > 0 Then tablo = TriBulle4(tablo, colonne_de_tri&, sens_du_tri)
    DicoCountOrder = tablo
End Function

'fonction tribulle optionel
Function TriBulle4(tabl, col, Optional sens = 0)
    Dim i#, e#, X#
    If sens = 0 Then TriBulle4 = tabl
    ReDim temp(UBound(tabl, 2))
    For i = 1 To UBound(tabl)
        If tabl(i, 1) = "" Then Exit For
        For e = i + 1 To UBound(tabl)
            If tabl(e, 2) = "" Then Exit For
            Select Case sens
            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
        Case 2
            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 Select
Next
Next
TriBulle4 = tabl
End Function

pour la macroOptions description(facultatif)
VB:
Sub UnregisterOptions()
    On Error Resume Next
    Application.MacroOptions Macro:="DicoCountOrder", Description:=Empty, ArgumentDescriptions:=Empty, Category:=Empty
    On Error GoTo 0
End Sub

Sub registerOptions()
    Dim Funct_description As String, argumtsArray

    '(max 255 caracteres)
    Funct_description = "Fonction Matricielle Dictionnaire " & vbCrLf & _
                        "Le tableau renvoyé a 1 ou 2 colonnes(chaine est nombres d'occurences" & vbCrLf & _
                        "Tri alphabetique ou par le nombres d'occurences" & vbCrLf & _
                        "Par ordre croissant ou decroissant" & vbCrLf & _
                        "Créated By patricktoulon"

    'Description des arguments de la fonction
    argumtsArray = Array("Adresse de la colonne à trier ", _
                         "1 pour tri chaîne  : 2 ou par le nombres d'ocurrences", _
                         "1 pour tri décroisant   /   2 pour tri croissant ")

    'appel  la sub pour enregistrer
    Application.MacroOptions Macro:="DicoCountOrder", _
                             Description:=Mid(Funct_description, 1, 255), _
                             ArgumentDescriptions:=argumtsArray, _
                             Category:="personnalisée"
End Sub


'***************************************
'a mettre dans l'open si on veut la description  et le formulaire de fonction
Sub auto_open(): registerOptions: End Sub
Sub auto_close(): UnregisterOptions: End Sub
'***************************************
demo2.gif


démo de la fonction
utilisation vba
demo2.gif


utilisation en matricielle
demo2.gif
 

Pièces jointes

  • fonction perso DicoAndCount.xlsm
    37.7 KB · Affichages: 22

Discussions similaires

Réponses
4
Affichages
1 K
Réponses
0
Affichages
1 K
Réponses
3
Affichages
559

Statistiques des forums

Discussions
312 082
Messages
2 085 171
Membres
102 805
dernier inscrit
emes