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 en temps d'exécution d'un tri


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Par défaut optimisation en temps d'exécution d'un tri
    Bonjour,

    J'ai fait une routine en VBA qui permet de trier les x premières lignes par ordre chronologique (de la date la plus petite a la plus grande). La dernière ligne du champ à trier etant la ligne d'index LastTask.
    Les dates se situe dans la première colonne

    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
    30
    31
    32
    33
    34
    35
    Sub switchligne_P(ByVal L1 As Integer, ByVal L2 As Integer) 'Permet d'intervertir 2 lignes
    Dim L As Integer
    If L1 > L2 Then
        L = L1
        L1 = L2
        L2 = L
    End If
    Cells(L2, 1).EntireRow.Cut
    Cells(L1, 1).EntireRow.Insert Shift:=xlDown
    Cells(L1 + 1, 1).EntireRow.Cut
    Cells(L2 + 1, 1).EntireRow.Insert Shift:=xlDown
    End Sub
     
     
    LastTask = xxx 'Dernier ligne où doit se finir le trie
     
    'Trie
        CurrentLigne = 1
        Do While (CurrentLigne < LastTask) 'Si CurrentLigne = LastTask il reste plus qu'une ligne, elle est donc dans l'ordre
            LowerDate = Cells(CurrentLigne, 1) 'Par default on considère les task du haut comme celle etant les plus petite date
            I_low = CurrentLigne
            i = CurrentLigne + 1
            Do While (i <= LastTask)
                IDate = Cells(i, 1)             'Lit la date de la ligne i
                If (LowerDate > IDate) Then    'Verifie que la date de la ligne i n'est pas plus petite
                    LowerDate = IDate               'Sauvegarde la nouvelle date plus petite
                    I_low = i
                End If
                i = i + 1
            Loop
            If (I_low <> CurrentLigne) Then
                switchligne_P CurrentLigne, I_low 'Met la ligne avec le date la plus petite à la place de la ligne courante
            End If
            CurrentLigne = CurrentLigne + 1
        Loop
    le principe de cette alogo est pour chaque ligne de regarder si en de sous il y en a une plus petit. si il y en a une plus petit alors on on interverti le ligne.


    Cette routine fonctionne parfaitement mais son temps d'exection et estrêmement lent.
    En effet, il utilise deux boucles while imbriqué l'un dans l'autre ce qui n'est pas bon...
    Quelqu'un a t'il une idée pour optimiser ce trie de maniere a le rendre plus rapide?

    1)Cells(L2, 1).EntireRow.Cut
    Cells(L1, 1).EntireRow.Insert Shift:=xlDown

    2)IDate = Cells(i, 1)
    Entre le 1 et 2 ci dessus quel est celui qui prend le plus de temps et combien de fois plus?


  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir,

    Inhibe l'affichage (gourmand) pendant le tri....
    Rétablis-le in fine ...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Par défaut
    Je vais essais mais je suis pas sur que se soit seulement dut à affichage car pendant ce trie excel ce bloque il met le petit sablié et on ne peu tplus rien faire. Au debut je croyais qu'il était bloqué mais quelques minutes apres il s'est remis normal et les lignes étaient triées...

    C'est bissard car il y a qu'une 30 aine de lignes à trier...

    Re-Salut ucfoutu,

    Tu me conseilles d'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    C'est bien ca?

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    oui.

    puis = true une fois le tri terminé...

    essaye...

  5. #5
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 079
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 079
    Par défaut
    SAlut
    J'ai pas lu avec beaucoup d'attention et au vu des réponse qui ont été données je manque certainement quelque chose, mais pourquoi ne pas utiliser Sort

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Range("D4:E10").Sort Key1:=Range("D4"), Order1:=xlAscending, Header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
            DataOption1:=xlSortNormal
    La "clef primaire de tri est dans la case D4 à D10 on tri par ordre croissant et ça organise les cellule D et E, j'ai fais ça vite fait avec l'enregistreur y'a surement des option en trop mais bon ça peut être une piste et a mon avis ça sera la méthode la moins gourmande, si bien sur c'est applicable a ce que tu souhaite faire.
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Par défaut
    Merci Qwazerty, la solution que tu proposes marche parfaitement


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

Discussions similaires

  1. Optimisation du temps d'exécution
    Par opensource dans le forum SQL
    Réponses: 18
    Dernier message: 18/04/2008, 18h10
  2. [datenum] Optimiser le temps d'exécution
    Par xduris dans le forum MATLAB
    Réponses: 11
    Dernier message: 08/08/2007, 16h07
  3. Optimisation du temps d'exécution d'une requête
    Par LeNovice dans le forum DB2
    Réponses: 6
    Dernier message: 12/07/2007, 13h47
  4. optimiser le temps d'exécution de l'explorateur windows
    Par ben_iap dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 31/01/2006, 22h04
  5. Réponses: 9
    Dernier message: 20/06/2005, 12h17

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