XL 2013 Problème de tri alphabétique avec scripting dictionary

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 !

kiko_23

XLDnaute Junior
Bonsoir à tous,

Je tente vainement d'obtenir un tri par ordre alphabétique sur le chargement d'une ComboBox via un scripting dictionary.
J'ai utilisé pour cela le code écrit il y a bien longtemps maintenant par monsieur Boisgontier, mais après avoir tout (?) tenté, pour une raison qui m'échappe le tri ne semble se faire que sur certains items.

Je vous remercie par avance pour votre attention à mon problème et vos éventuelles lumières et joins ici le fichier qui me sert pour ce test.

PS : la ComboBox se charge dans "Sheet1" à l'activation de la dite feuille
 

Pièces jointes

Solution
bonjour
on ira plus vite avec la mienne
rien ne sert de se balader avec des variables en byref si c'est pas utile
la fonction devient l'array (return )
VB:
Sub nav()
    Set ComboBox_1 = ActiveSheet.Shapes.AddFormControl(xlDropDown, Left:=Cells(2, 2).Left, Top:=Cells(2, 2).Top, Width:=160, Height:=20)
    Set F = Sheets("Sheet2")
    Set plageCbb = F.Range("A1:A" & F.Range("A" & Rows.Count).End(xlUp).Row)
    Call chargementCbb
    ComboBox_1.ControlFormat.List = temp
End Sub

Sub chargementCbb()
    Set dataCbb = CreateObject("Scripting.Dictionary")
    a = plageCbb
    On Error Resume Next
    For i = LBound(a) To UBound(a)
        If a(i, 1) <> "" Then dataCbb(Trim(a(i, 1))) = ""
    Next i
    temp = OrderedArray(dataCbb.keys)...
bonjour
on ira plus vite avec la mienne
rien ne sert de se balader avec des variables en byref si c'est pas utile
la fonction devient l'array (return )
VB:
Sub nav()
    Set ComboBox_1 = ActiveSheet.Shapes.AddFormControl(xlDropDown, Left:=Cells(2, 2).Left, Top:=Cells(2, 2).Top, Width:=160, Height:=20)
    Set F = Sheets("Sheet2")
    Set plageCbb = F.Range("A1:A" & F.Range("A" & Rows.Count).End(xlUp).Row)
    Call chargementCbb
    ComboBox_1.ControlFormat.List = temp
End Sub

Sub chargementCbb()
    Set dataCbb = CreateObject("Scripting.Dictionary")
    a = plageCbb
    On Error Resume Next
    For i = LBound(a) To UBound(a)
        If a(i, 1) <> "" Then dataCbb(Trim(a(i, 1))) = ""
    Next i
    temp = OrderedArray(dataCbb.keys)
End Sub


Function OrderedArray(a, Optional gauc = -1, Optional droi = -1, Optional sens As Long = 0) ' Quick sort
    'patricktoulon
    Dim ref, g&, d&, temp, X
    droi = IIf(droi = -1, UBound(a), droi): gauc = IIf(gauc = -1, LBound(a), gauc)
    ref = a((gauc + droi) \ 2)
    g = gauc: d = droi
    Do
        Select Case sens 'choix du sens
            Case 0
                ' Pour un tri croissant
                Do While a(g) < ref: g = g + 1: Loop
                Do While ref < a(d): d = d - 1: Loop
            Case 1
                ' Pour un tri décroissant
                Do While a(g) > ref: g = g + 1: Loop
                Do While ref > a(d): d = d - 1: Loop
        End Select
        If g <= d Then
            temp = a(g): a(g) = a(d): a(d) = temp
            g = g + 1: d = d - 1
        End If
    Loop While g <= d
    If g < droi Then X = OrderedArray(a, g, droi, sens)
    If gauc < d Then X = OrderedArray(a, gauc, d, sens)
    OrderedArray = a
End Function
patrick
 
Et bien messieurs, pour une première fois ici je dois bien avoué que je suis un peu soufflé par votre réactivité, chapeau bas !
Vos deux solutions fonctionnent à merveille et mon cœur balance...

Patrick si cela peut être expliqué à un débutant sur ce sujet sans vous demander trop de temps, je serais ravi d'être éclairé sur ce que vous entendez par "(...) se balader avec des variables en byref si c'est pas utile.

Concernant "on ira plus vite" je suppose que vous parlez de temps de traitement ?

Maintenant au sujet du code de monsieur Boisgontier, j'avoue que je serais tout même très curieux de savoir ce qui y cloche.

Quoi qu'il en soit encore et déjà un très grand merci à vous et (à la première personne qui m'a répondu en me conseillant d'utiliser plutôt un array, sur le forum de présentation où j'avais posté cette question par mégarde) !
 
Bonsoir,
VB:
Sub test()
With CreateObject("AdoDB.Connection")
    .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;HDR=No;"""
    Sheets("Sheet1").Shapes("Zone combinée 117").ControlFormat.List = .Execute("Select Distinct [F1] From [Sheet2$] ORDER BY [F1]").getrows
    .Close
End With
End Sub
Bonsoir et merci beaucoup !

Je vais également tester cette solution demain. Je sens qu'il va falloir que je fasse un choix cornélien. Comme dans un premier temps je ne pense pas pouvoir vraiment me rendre compte de la vitesse de traitement avec mes 40 items de départ, je suppose que je vais m'orienter vers le plus économe en lignes de code. A moins que l'un de vous ne me précise laquelle de ces solutions aurait sa faveur et/ ou serait la plus potentiellement compatible avec des versions d'
Excel antédiluviennes, car il se peut que je fasse tourner ce fichier sur des machines pas toutes neuves et surement pas très à jour en terme de version (pour être plus précis, des collectionneurs pas forcément à la pointe de l'informatique personnelle).

Bonne nuit à tous !
 
Dernière édition:
Bonsoir à tous,

Ma P'tite version à ma pomme.
  • Le tri se fait via Excel mais on rétablit les valeurs non triées après le tri.
  • On donne un petit nom à la forme créée pour ne pas la dupliquer chaque fois qu'on sélectionne la feuille "Sheet1".
  • Mais malgré tout, on réactualise la liste de la combobox à chaque activation de "Sheet1".
  • On pourrait ôter les doublons sans problème si on le désirait.

Il n'y a plus de module "Module1". Tout le code est dans le module de la feuille "Sheet1". Le code est commenté. Il n'y a plus que 4 variables locale.
Eviter le plus possible les variables globales au niveau module. Préférez plutôt les variables locales dont la durée de vie est courte et limitée à la durée de la procédure ou de la fonction. Il est des cas où des variables de niveau module sont justifiées mais pas si souvent que ça.

VB:
Private Sub Worksheet_Activate()
Const NomDeLaCBB = "Ma_Cbb"                        ' nom qu'on attribue à la combobox
Dim der As Long, t, tsort, ComboBox_1 As Object    ' uniquement 4 variables et locales
   Application.ScreenUpdating = False
   With Sheets("Sheet2")                           ' avec la feuille sheet2
      der = .Cells(Rows.Count, "a").End(xlUp).Row  ' dernière ligne avec une valeur de la colonne A
      t = .Range("a1").Resize(der)                 ' lecture des valeurs de la colonne A (lignes de 1 à der)
      ' Tri de la plage de la colonne A
      .Range("a1").Resize(der).Sort key1:=.Range("a1"), order1:=xlAscending, MatchCase:=False, Header:=xlNo
      ' der => la nouvelle dernière ligne de la colonne A (sans les cellules vides - conséquence du tri ascendant)
      der = .Cells(Rows.Count, "a").End(xlUp).Row
      tsort = .Range("a1").Resize(der)       ' lecture des valeurs triées
      .Range("a1").Resize(UBound(t)) = t     ' on remet les valeurs itiliales de la colonne A (donc non triées)
   End With
   With Sheets("Sheet1")      ' avec la feuille sheet2
      On Error Resume Next    ' en cas d'erreur, on passe à l'instruction suivante
      Set ComboBox_1 = .Shapes(NomDeLaCBB)   ' on essaye d'attribuer à ComboBox_1 la forme qui a pour nom NomDeLaCBB
      On Error Resume Next    ' on rétablit le traitement normal des erreurs
      If ComboBox_1 Is Nothing Then
         ' ComboBox_1 est "rien" ce qui signifie que la combobox n'est pas créée donc le fait et on la nomme avec NomDeLaCBB
         Set ComboBox_1 = .Shapes.AddFormControl(xlDropDown, Left:=.Cells(2, 2).Left, Top:=.Cells(2, 2).Top, Width:=160, Height:=20)
         ComboBox_1.Name = NomDeLaCBB           ' et on lui attribue le nom NomDeLaCBB
      End If
      ComboBox_1.ControlFormat.List = tsort     ' on affecte à la liste les valeurs triées
   End With
End Sub
 

Pièces jointes

Dernière édition:
Et bien messieurs, pour une première fois ici je dois bien avoué que je suis un peu soufflé par votre réactivité, chapeau bas !
Vos deux solutions fonctionnent à merveille et mon cœur balance...

Patrick si cela peut être expliqué à un débutant sur ce sujet sans vous demander trop de temps, je serais ravi d'être éclairé sur ce que vous entendez par "(...) se balader avec des variables en byref si c'est pas utile.

Concernant "on ira plus vite" je suppose que vous parlez de temps de traitement ?

Maintenant au sujet du code de monsieur Boisgontier, j'avoue que je serais tout même très curieux de savoir ce qui y cloche.

Quoi qu'il en soit encore et déjà un très grand merci à vous et (à la première personne qui m'a répondu en me conseillant d'utiliser plutôt un array, sur le forum de présentation où j'avais posté cette question par mégarde) !
avec le code de notre regretté jacques la variable temp est baladée dans la sub de tri pour être récupérée comme tel par la sub appelante
le problème avec byref selon si il est explicite ou implicite et selon les versions d'excel on a des effets de bord
moi je pratique la fonction responsive
truc = mafonction(argument blablabla) et a la fin de la fonction la fonction renvoie le tableau et cela est valable dans toute les versions d'excel
le principe de tri avec l'algorrhitme quicksort methode dites (diviser pour mieux régner) et une methode qui permet d'alleger la memoire et de trier portion par portion de l'array arriver a la moitié elle devrait avoir a 95% fini le tri
si cela t'intéresse de comprendre comment fonctionnent les alogo de tri je t'invite à aller voir cette ressource qui est à but école
ou je montre les avantages et inconveniant de divers algo de tri( en commencant par le tri a bulle,metzner,shellselection,etc...)
 
avec le code de notre regretté jacques la variable temp est baladée dans la sub de tri pour être récupérée comme tel par la sub appelante
le problème avec byref selon si il est explicite ou implicite et selon les versions d'excel on a des effets de bord
moi je pratique la fonction responsive
truc = mafonction(argument blablabla) et a la fin de la fonction la fonction renvoie le tableau et cela est valable dans toute les versions d'excel
le principe de tri avec l'algorrhitme quicksort methode dites (diviser pour mieux régner) et une methode qui permet d'alleger la memoire et de trier portion par portion de l'array arriver a la moitié elle devrait avoir a 95% fini le tri
si cela t'intéresse de comprendre comment fonctionnent les alogo de tri je t'invite à aller voir cette ressource qui est à but école
ou je montre les avantages et inconveniant de divers algo de tri( en commencant par le tri a bulle,metzner,shellselection,etc...)
Bon, apparemment je ne me suis pas couché non plus hein ^^
Merci beaucoup pour ces explications claires et circonstanciées ! Je vais aller lire avec intérêt votre lien !

En vous souhaitant une excellente nuit
 
Quoi qu'il en soit encore et déjà un très grand merci à vous et (à la première personne qui m'a répondu en me conseillant d'utiliser plutôt un array, sur le forum de présentation où j'avais posté cette question par mégarde) !
Hello,
en fait ce n'était pas une array mais une ArrayList qui possède une fonction de tri (voir ma réponse ici).
Ami calmant, J.P
 
avec le code de notre regretté jacques la variable temp est baladée dans la sub de tri pour être récupérée comme tel par la sub appelante
le problème avec byref selon si il est explicite ou implicite et selon les versions d'excel on a des effets de bord
moi je pratique la fonction responsive
truc = mafonction(argument blablabla) et a la fin de la fonction la fonction renvoie le tableau et cela est valable dans toute les versions d'excel
le principe de tri avec l'algorrhitme quicksort methode dites (diviser pour mieux régner) et une methode qui permet d'alleger la memoire et de trier portion par portion de l'array arriver a la moitié elle devrait avoir a 95% fini le tri
si cela t'intéresse de comprendre comment fonctionnent les alogo de tri je t'invite à aller voir cette ressource qui est à but école
ou je montre les avantages et inconveniant de divers algo de tri( en commencant par le tri a bulle,metzner,shellselection,etc...)
Bonjour Patrick, merci pour ta vidéo, je n'ai pas toujours tout saisi et cela mériterait un nouveau visionnage de la première partie, mais dans l'ensemble me voici bien plus affranchi sur la façon dont fonctionnent les méthodes de tri !
 
A l'ouverture on ne passe pas dans activate .

C'est seulement après être passé sur une autre feuilles que l'activate fonctionne.

Si le fournisseur n'es pas compatible avec ta version excel et/ou windows il me faudra faire mon deuil de ce genre de solution. A moins que je trouve un fournisseur universel pour excel.

Je vais quand même pas demander aux utilisateurs de télécharger et installer le MDAC de chez Microsoft.
 
- 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
Retour