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

XL 2013 les machistes (utilisateurs de Mac OS peuvent ils tester ceci

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
@RyuAutodidacte m' a rappelé un lien vers un amis de l'autre monde concernant une classe pseudo dictionnaire pour MAC
malgré que j'apprécie beaucoup l'auteur (avec qui j'ai même collaboré sur l’accélérateur de requête entre autres ) ,je trouve que c'est un peu usine à gaz

j'ai donc fait les choses à ma façon
mais avant d'aller plus loin car des idées j'en ai plein ,si vous êtes un utilisateur sur MAC pouvez vous tester ce pseudo dictionnaire
sur Windows ça match il me faut confirmation sur MAC

Merci pour vos retours
 

Pièces jointes

  • classe dictionary pour Mac.xlsm
    18.3 KB · Affichages: 10
Dernière édition:

RyuAutodidacte

XLDnaute Impliqué
Hello tous

@patricktoulon … des news
je pense avoir bien régler mon tri, j'aimerais y ajouter une option particulière (plus à voir avec toi pour éviter que je casse tout pouvoir y insérer un objet par la suite)
option particulière : qd y a pas de clé prendre l'item en tant que clé

petit aperçu sur le tri :


 

patricktoulon

XLDnaute Barbatruc
re
problème pas difficile à régler sachant que tu a deux argument dans la sub ADD
si l'un est vide c'est l'autre
cependant tu t’éloigne un peu trop du dictionnaire
alors que déjà chez moi ton split donne des points d'interrogation dans les résultats finals
tu veux encore ajouter des trucs

dis moi dans quel épisode galactique, tu a vu que l'on faisait un Add dans un dictionnaire sans clé
tu raisonne trop collection

au final tu es en train de me faire une pseudo collection améliorée pas un dictionnaire
et cela avec un object collection et puis est dans un module classe ,j'ai du mal a ne pas en rire




j'ai bien peur que l'idée générale du projet soit corrompu dans tête
 

laurent950

XLDnaute Barbatruc
Bonsoir @patricktoulon, @RyuAutodidacte

ben il y a deux modules un croissant et l'autre decroissant

J'ai fusionné les deux codes en un seul code.

TrisCroissantDecroissant
pour 10 000 Items sur une colonne (Avec le générateur d'Items)


Option depuis le module standard
IntroSort t, True ' Pour le tri croissant
IntroSort t, False ' Pour le tri décroissant

VB:
Sub QuickSortCroissantDecroissant()
    Dim t() As Variant
    Dim Flag As Boolean
    Range(Cells(2, 3), Cells(Cells(1048576, 3).End(xlUp).Row, 3)).Clear
    t = Range(Cells(2, 1), Cells(Cells(1048576, 1).End(xlUp).Row, 1))
 
    tt = Timer()
    IntroSort t, True: Flag = True  ' Pour le tri croissant
    'IntroSort t, False: Flag = False   ' Pour le tri décroissant
 
    If Flag = True Then
     Cells(1, 5) = Timer() - tt ' Pour le tri croissant
     Cells(1, 3) = "tri croissant"
     'MsgBox Timer() - tt
    Else
     Cells(2, 5) = Timer() - tt ' Pour le tri décroissant
     Cells(1, 3) = "tri décroissant"
     'MsgBox Timer() - tt
    End If
 
    ' Afficher le tableau trié
    Cells(2, 3).Resize(UBound(t, 1), UBound(t, 2)) = t
End Sub

Sub IntroSort(arr() As Variant, ByVal isAscending As Boolean)
    Dim low As Long, high As Long
    low = LBound(arr)
    high = UBound(arr)
    IntroSortRecursive arr, low, high, 2 * Log2(high - low + 1), isAscending
End Sub

Sub IntroSortRecursive(arr() As Variant, ByVal low As Long, ByVal high As Long, ByVal maxDepth As Long, ByVal isAscending As Boolean)
    If high <= low Then Exit Sub
    If maxDepth = 0 Then
        ' Si la profondeur maximale est atteinte, utilisez un algorithme de tri plus simple (par exemple, le tri par insertion).
        InsertionSort arr, low, high, isAscending
    Else
        Dim pivotIndex As Long
        If isAscending Then
            pivotIndex = Partition(arr, low, high, isAscending)
        Else
            pivotIndex = Partition(arr, low, high, isAscending)
        End If

        IntroSortRecursive arr, low, pivotIndex - 1, maxDepth - 1, isAscending
        IntroSortRecursive arr, pivotIndex + 1, high, maxDepth - 1, isAscending
    End If
End Sub

Function Partition(arr() As Variant, ByVal low As Long, ByVal high As Long, ByVal isAscending As Boolean) As Long
    Dim pivot As Variant
    pivot = arr(low, 1)
    Dim i As Long
    Dim j As Long
    i = low
    j = high + 1

    Do
        If isAscending = True Then
            'le tri croissant :
            ' ----------------
            Do
                i = i + 1
            On Error Resume Next
            Loop While arr(i, 1) < pivot And i <= high ' Changer pour le tri croissant
            On Error GoTo 0
   
            Do
                j = j - 1
            Loop While arr(j, 1) > pivot
   
        Else
   
            'le tri décroissant :
            ' -----------------
            Do
                i = i + 1
            On Error Resume Next
            Loop While arr(i, 1) > pivot And i <= high ' Changer pour le tri décroissant
            On Error GoTo 0
   
            Do
                j = j - 1
            Loop While arr(j, 1) < pivot
        End If
       
        If i < j Then
            ' Échanger les éléments
            Dim temp As Variant
            temp = arr(i, 1)
            arr(i, 1) = arr(j, 1)
            arr(j, 1) = temp
        End If
    Loop While i < j
 
    ' Échanger pivot avec l'élément à la position j
    arr(low, 1) = arr(j, 1)
    arr(j, 1) = pivot
 
    Partition = j
End Function



Sub InsertionSort(arr() As Variant, ByVal low As Long, ByVal high As Long, ByVal isAscending As Boolean)
    Dim i As Long, j As Long
    For i = low + 1 To high
        j = i
        While j > low And (IIf(isAscending, arr(j, 1) < arr(j - 1, 1), arr(j, 1) > arr(j - 1, 1)))
            Swap arr(j, 1), arr(j - 1, 1)
            j = j - 1
        Wend
    Next
End Sub

Sub Swap(ByRef a As Variant, ByRef b As Variant)
    Dim temp As Variant
    temp = a
    a = b
    b = temp
End Sub

Function Log2(ByVal x As Double) As Long
    Log2 = WorksheetFunction.RoundDown(Log(x) / Log(2), 0)
End Function
 

Pièces jointes

  • VBATrisObptimisé.xlsm
    33.6 KB · Affichages: 2
Dernière édition:

patricktoulon

XLDnaute Barbatruc
alors mon petit ryu
voila comment on fait simple avec un object collection en moins 10 minutes
un module standard pour tester
VB:
Dim dico As New Pdictionary2

Sub test()
Set dico = New Pdictionary2
dico.Add "toto", 35
dico.Add "titi", 28
dico.Add "loulou", 17
dico.Add "titi", 80


MsgBox dico.keys("titi")
k = dico.keys

MsgBox Join(k, ",")
End Sub
la classe nommée Pdictionary2
VB:
Private col As New Collection

Public key As String
Public item As Variant

Public Sub Add(clé, Optional valeur As Variant = Empty)
    Dim C, cl As New Pdictionary2, exist As Boolean
    For i = 1 To col.Count
        If col(i).key = clé Then exist = True: x = i:: Exit For
    Next
    If Not exist Then
        cl.key = clé
        If IsObject(valeur) Then Set cl.item = valeur Else cl.item = valeur: col.Add cl, clé
    Else
        If IsObject(valeur) Then Set col(x).item = valeur Else col(x).item = valeur
    End If
End Sub

Public Function keys(Optional clé As String = "")
    keys = Empty
    If clé = "" Then
        ReDim t(1 To col.Count)
        For i = 1 To col.Count: t(i) = col(i).key: Next
        keys = t
    Else
        keys = col(clé).item
    End If
End Function
d’après toi

1°qu'y a t il dans la collection ?

2°d'après toi comment je fait pour avoir la liste des clés alors que l'on ne peux pas l'avoir dans une collection ?
et y a pas de concat , de split ou de shmilblik qui tiennent

puré de manon j'ai fait ça en moins de 10 minutes
reste plus qu'a ajouter les options et les fonctions similaires au dico

@lauren950 je regarde t’inquiète je suis toujours ton truc
 

patricktoulon

XLDnaute Barbatruc
@laurent950 ben au final c'est plus long avec ta fonction croissantdecroissant true/false
pas de beaucoup disons que tu est au niveau de la fusion chez moi entre 0.03xx et 0.05xx
la quicksortpatrick entre 0.02xx et 0.03xx

conclusion
1° on ne gagne rien a mélanger les genres (quicksort et insertion )
2° on ne gagne rien non plus a moduler en plusieurs fonction le rouage du quicksort

à celui qui t'a aiguillé vers cette voie dis lui de ma part de prendre ces médicaments

cela dit comme je l'ai mise dans la ressource je vais la laisser ,tout du moins cette version au moins elle tri jusqu'au bout
bravo au moins c'est abouti et fonctionnel
il y en a d'autre qui peuvent pas en dire autant hein !! suivez moi du regard
 

patricktoulon

XLDnaute Barbatruc
laurent tu a gagné ta banière
VB:
'******************************************************************************************************************************************************
'    _     _       _   _  __      ____  _     _ _______ ____ ____ __
'   //    /\\     //  // // \\   //    //|   //   //   /   //    /  \
'  //    //__\   //  // //__//  //__  // |  //   //   /___//___ /   /
' //    //   \\ //  // //  \\  //    //  | //   //       /    //   /
'//___ //    ////__// //   // //___ //   |//   //    ___/ ___/ \__/
'******************************************************************************************************************************************************
 

RyuAutodidacte

XLDnaute Impliqué
Bonjour à tous,

@patricktoulon
L'objet dictionnaire selon l'aide de MS (oui je sais tu connais, c'est juste pour montrer ce que je présente par rapport à cette capure) :


problème pas difficile à régler sachant que tu a deux argument dans la sub ADD
si l'un est vide c'est l'autre
Ca je sais j'ai jamais dit que c'était un problème !!!
au final tu es en train de me faire une pseudo collection améliorée pas un dictionnaire
et cela avec un object collection et puis est dans un module classe ,j'ai du mal a ne pas en rire
Non je ne fais pas un pseudo, mais je fais qq chose que j'ai envie de faire et qui regroupe le bon coté des 2,
je le fais à titre personnel
'ai bien peur que l'idée générale du projet soit corrompu dans tête
Rien n'est corrompu, si tu veux seulement le dico tu vas l'avoir
puré de manon j'ai fait ça en moins de 10 minutes
je ne me compare pas à toi qui fait ça tout le temps … (je fais autre chose que du excel vba … et ce weekend j'avais pas envie d'en faire, occupé à autre chose de la vie courante…)
c'est pour montrer a ryu qui est en train de s'intoxiquer avec sa central atomique
Comment tu sais ??? tu n'as pas vu le code … et ce n'est pas une centrale atomique c'est bien simplifié …

PS : je préfère gérer le Overwrite et cumulate comme je le fait et pas de manière générale comme tu me l'as montré ceci afin de prévoir dans quelles conditions cela s'applique ou pas dans une boucle par exemple

Voilà le dictionnaire que tu attendais : 2 subs de tests
 

Pièces jointes

  • Dico pour P.xlsm
    27.6 KB · Affichages: 6
Dernière édition:
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…