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 :

Optimisation de tri sur tableau [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 30
    Par défaut Optimisation de tri sur tableau
    Bonjour à tous,

    J'ai une macro à faire relativement classique et je me pose des questions sur la méthode à employer.

    Je dispose d'un tableau avec une vingtaine de colonnes correspondant à des critères et plusieurs centaines de lignes correspondant à des entrées.

    Je dois effectuer plusieurs tris sur les données et sortir les tableaux des évènements correspondants dans plusieurs feuilles de calculs. (juste que là assez classique )

    Un des critères est une date propre à chaque entrée, hors dans la majorité de mes tris, je ne prend que les entrées qui datent des X derniers jours (ce qui retire pas mal d'enregistrement).

    En raison du nombre élevé d'éléments et par soucis d'optimisation, je souhaite donc trouver une manière de retirer d'abord les éléments qui n'ont pas la bonne date car cela retire environ 90% des données pour ensuite appliquer les critères plus spécifiques.


    Comment faire ?

    1°/ Je charge mes données dans un array à 2 dimensions.
    Avec une boucle sur la colonne de date des éléments, je copie dans un nouveau tableau les éléments qui vont bien (et je continue à trier sur ce nouveau tableau)

    2°/ Je charge mes données dans un array à 2 dimensions.
    Puis je charge les index des éléments dans une collection, Je boucle sur le tableau et à chaque fois qu'un élèment ne convient pas, je retire son index de la collection ( et je trie en bouclant sur les index de la collection )

    3°/ Je charge mes données dans un array à 2 dimensions.
    Je met tous mes critères dans une grosse condition et je passe une seule fois sur chaque ligne ( par exemple, date < 10 jours & lieu = paris & pièce = moteur & note = 4 ). Le problème c'est que pour chaque feuille de calcul ou les critères diffèrent je dois repasser sur toutes les lignes alors que le critère date est tout le temps date < 10 jours ( par exemple, date < 10 jours & lieu = marseille & pièce = vitre )


    Quelle est la méthode la plus rapide ? ( si il y en a d'autres je serais ravi de les connaître, je ne suis pas du tout habitué au VBA :p)


    J'espère avoir été le plus clair possible, ce n'est pas évident ^^

    Bonne journée :p

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 30
    Par défaut
    Bon alors je me répond à moi-même pour ceux que ça intéressent.

    J'ai trouvé une solution (il y en a surement d'autres) qui est rapide et opti.

    ça correspond à la solution 1 mais au lieu de copier dans un tableau différent je copie dans le même tableau au fur et à mesure que je le parcours (j'ai donc une économie de mémoire, et peut-être même de temps).

    Voilà je montre l'algo qui est pas facile à comprendre comme ça, si quelqu'un veut des précisions n'hésitez pas à poster :

    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
     
        Dim Tblo()
        Dim j As Integer
        Dim DernLigne As Long
        j = 2
        DernLigne = Range("A" & Rows.Count).End(xlUp).Row 'choppe la dernière ligne des données
        Tblo = Range("A1:Z" & DernLigne).Value 'charge le tableau à la bonne taille
     
        Dim num_element As Integer
        Dim nouveau_num As Integer
        nouveau_num = 1
     
        For num_element = 1 To DernLigne 'on parcours le tableau
            If   'Mettre ici votre critère à valider
                For i = 1 To nombre_colonne
                    Tblo(nouveau_num, i) = Tblo(num_element, i) 'on écrit cette élément à la position nouveau_num
                Next
                nouveau_num = nouveau_num + 1 'on incrémente nouveau_num à chaque élément qui valide le critère
            End If
        Next
     
       DernLigne = nouveau_num - 1 'on retire 1 car y a la dernière itération à virer
     
    'Tblo contient entre 1 et DernLigne les valeurs filtrées, attention à ne pas utiliser Ubound(Tblo) car entre DernLigne et Ubound(Tblo) il y a d'anciennes valeurs
    Edit : petite faute de syntax

  3. #3
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Ca m'étonne tel que proposé fonctionne comme voulu.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 30
    Par défaut
    Quel est le passage qui gêne ?

    Amicalement,

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tblo(nouveau_num, i) = Tblo(num_element, i)

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 30
    Par défaut
    voilà plutôt qu'un long discours, un petit schéma qui résume le principe.

    Après si c'est la "syntaxe" qui gêne, ça peut paraître contre-intuitif mais on utilise ce principe dans pas mal de langage, (pour décaler des lignes d'un tableau en C par exemple je faisais des truc similaire Tblo[i-1]=Tblo[i], c'est ça qui m'a donné l'idée pour l'adapter à mon problème)

    Cordialement,
    Images attachées Images attachées  

  7. #7
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Là on est d'accord sur le principe mais ton tableau de donnée est tab_AT et non Tblo qui n'est même pas dimensionné, non?

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 30
    Par défaut
    Exact j'ai oublié de remplacer une variable dans le code,
    Il faut mettre Tblo à la place de tab_AT (j'ai changé les noms des variablesp our plus de clarté et j'avais oublié celle-là).

    Edit : voilà code corrigé.

    Edit 2 : tu sais comment faire pour définir de manière dynamique mon range pour les lettres. pour les chiffres j'ai pu mettre une variable mais je ne sais pas comment faire pour les lettres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        DernLigne = Range("A" & Rows.Count).End(xlUp).Row 'choppe la dernière ligne des données
        Tblo = Range("A1:Z" & DernLigne).Value 'charge le tableau à la bonne taille

  9. #9
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Si on cherche la dernière ligne remplie sur la colonne 1 et la dernière colonne remplie sur la ligne 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim LastLig As Long
    Dim LastCol As Integer
    Dim Tblo
     
    With Worksheets("Feuil1")
        LastLig = .Cells(.Rows.Count, 1).End(xlUp).Row    'dernière ligne remplie sur colonne 1
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column    'dernière colonne remplie sur ligne 1
        Tblo = .Range(.Cells(1, 1), .Cells(LastLig, LastCol))
        'ou bien
        Tblo = .Range("A1").Resize(LastLig, LastCol)
    End With

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2012
    Messages : 30
    Par défaut
    Merci bien,

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

Discussions similaires

  1. [Sharepoint Designer 2007] Tri sur tableau se marche pas
    Par Enthau dans le forum SharePoint
    Réponses: 0
    Dernier message: 23/04/2008, 14h48
  2. Tri sur tableau multi pour génération de jointures SQL
    Par Djakisback dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 21/09/2007, 14h58
  3. pb de tri sur tableau
    Par bagos01 dans le forum ASP
    Réponses: 3
    Dernier message: 07/02/2007, 22h47
  4. Réponses: 3
    Dernier message: 21/09/2006, 15h55
  5. Tri sur tableau à 2 dimensions
    Par Poussy-Puce dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/03/2006, 19h36

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