IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Meilleure méthode de tri pour les combobox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 431
    Par défaut Meilleure méthode de tri pour les combobox
    Bonjour à tous,
    je dispose d'une série de combobox dont je veux trier les valeurs. J'utilise pour cela la méthode de silkyroad.
    Le problème est que j'ai beaucoup, beaucoup de données, donc le temps pris est énorme.

    Comment est-ce que je pourrais optimiser ce tri?

    Je pense utiliser un quicksort, mais je ne suis pas sur de la pertinence de ce choix. Si quelqu'un à une expérience là dessus, (ou même un ptit bout de code en vba)...

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Pour aller plus vite, je connais 2 méthodes :
    - la requête SQL(1)
    - le traitement par tableaux(2).

    Tout dépend de la configuration de ton problème.

    Si tu dois Filtrer + Trier + Regrouper la requête est performante et assez facile.
    Si tu as un grand nombre de listes à établir, cela va finir par redevenir long. Une vingtaine de champs, 10 000 lignes, c'est parti pour une dizaine de secondes.
    Si ta base de données est très grosse, avec cette méthode l'appli peut avoir des vapeurs... surtout les versions avant 2007.
    Pour faire cela, tu trouveras des éléments précis en FAQ

    Le traitement par des tableaux est très performant mais beaucoup plus complexe. Tout dépend là encore de ton projet. Mais par exemple si tu as une base de 40 champs, 10 000 lignes, un formulaire avec affichage de 10 champs et 20 champs en critères de filtrage, c'est l'usine à gaz...
    Pour le tri lui même avec un algo de tri rapide, et sur un PC de base, tu peux trier 1000 mots de 4 lettres en environ 20 ms. Les algos sont publics, leur optimisation, pas toujours. L'algo "de base" de tri rapide se met à traîner quand la liste à trier est très homogène, ce qui n'est pas rare du tout.
    Pour faire cela, des bouts de code ne te seront pas très utiles, sauf si ton pb est TRES simple.

    Cordialement,

    PGZ

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 431
    Par défaut
    Hum, pour le (1), tu sous-entends que l'on peut utiliser SQL avec excel??? Je ne savais pas.

    Sinon concernant mon problème, je dispose d'un tableau d'une cinquantaine de colonnes et d'environ 10000 lignes, donc je suis dans la situation (2). Je dois faire des menus déroulant sur une partie de ces colonnes. Chaque menu comporte toutes les valeurs de la colonne.

    j'ai au préalable chargé toutes les plages de mes colonnes dans des collections (avec des attributs particuliers) et j'alimente mes combobox avec ces collections. Cela me permet de faire mes traitements un peu plus rapidement. Maintenant je planche sur l'algorithme du quicksort.

  4. #4
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    En effet, avec ce genre de dimensions, personnellement je préfère utiliser des tableaux et me peler les filtrages, tris et regroupements.
    Tu as une liste par champ? Si oui ça fait beaucoup. Je suppose que tu n'as pas dans chaque champ une valeur différente à chaque ligne. J'imagine donc tu vas avoir aussi du regroupement.
    Et toutes ces listes elles vont te servir à quoi, faire un filtre?

    Pour l'algo du tri rapide, je suppose que tu connais. Je te donnes quelques conseils :
    • si tu as plusieurs opérations, fais les dans l'ordre filtrage-tri-regroupement,
    • en matière de tri, ce n'est pas forcément le code le plus court qui sera le plus rapide,
    • le temps de tri dépend du nombre de comparaisons et du nombre de lectures-écritures,
    • n'hésite pas à utiliser des chronos précis, c'est finalement la seule façon de mettre au point,
    • méfie-toi des tris de listes homogènes.


    Si tu arrives à trier 10 000 mots en moins de 250 ms sur une machine basique, tu fais signe!

    PGZ

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 431
    Par défaut
    Tout dépend des colonnes, dans certaines j'aurais 10000 valeurs toutes différentes, dans d'autres, seulement une dizaine de valeurs différentes sur l'ensemble des cellules. Mon objectif est de pouvoir filtrer sur certaines de ces valeurs.

    Pas de soucis pour l'algo.

    En fait, je viens de coder un quicksort en utilisant un algo récupéré sur le net, et j'ai réduit mon temps de chargement de quelques minutes (~3) à moins d'une dizaine de secondes ce qui me convient tout à fait. Comme quoi vive Quicksort.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    Private Sub Split(cbMenu As ComboBox, iFirst As Integer, iLast As Integer, iPivot As Integer)
      Dim iCompteur As Integer
      Dim sVal As String
     
      iPivot = iFirst
      iCompteur = iLast + 1
      sVal = cbMenu.List(iPivot)
      Do
        Do
          iCompteur = iCompteur - 1
        Loop Until (cbMenu.List(iCompteur) < sVal) Or (iPivot = iCompteur)
        cbMenu.List(iPivot) = cbMenu.List(iCompteur)
        Do While (iPivot < iCompteur) And (cbMenu.List(iPivot) <= sVal)
          iPivot = iPivot + 1
        Loop
        cbMenu.List(iCompteur) = cbMenu.List(iPivot)
      Loop Until iPivot = iCompteur
      cbMenu.List(iPivot) = sVal
    End Sub
     
    Private Sub QuickSort(cbMenu As ComboBox, iFirst As Integer, iLast As Integer)
      Dim iPivot As Integer
     
      If iFirst < iLast Then
        Call Split(cbMenu, iFirst, iLast, iPivot)
        Call QuickSort(cbMenu, iFirst, iPivot - 1)
        Call QuickSort(cbMenu, iPivot + 1, iLast)
      End If
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. {Site multiLingue} Meilleur moyen de stockage pour les clés de langues
    Par pierrehs dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 16/02/2011, 08h53
  2. Réponses: 1
    Dernier message: 17/04/2010, 02h18
  3. Réponses: 0
    Dernier message: 18/05/2007, 17h32
  4. méthode sans sql pour les doublons
    Par pat1545 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 15/08/2006, 20h29
  5. [FLASH MX2004] Explication pour les comboBox
    Par Sorento dans le forum Flash
    Réponses: 7
    Dernier message: 18/06/2005, 23h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo