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 :

Tris par ordre croissant-Accélération possible?


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Par défaut Tris par ordre croissant-Accélération possible?
    Bonjour, j'ai mis en place une macro vba me permettant de trier une liste de plus de 10 000 références.
    La macro commence par enlever les doublons, il ne reste alors plus que 1690 références, puis les trie par ordre croissant.
    Je joins un fichier exemple.

    Je trouve le temps d'exécution un peu lent sachant que ce code s'effectue au lancement d'un formulaire. Quelqu'un aurait-il une idée pour accélérer tout ça?
    Merci à ceux qui auront pris le temps de me lire.


    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Sub Macro1()
    '
    ' Macro1 Macro
    '
    Dim temp, mondico
    Set mondico = CreateObject("Scripting.Dictionary")
    Workbooks("Test").Sheets("Feuil1").Activate
    numproduct = WorksheetFunction.CountA(Columns(2))
    Table = Sheets("Feuil1").Range("B2:B" & numproduct)
    For i = LBound(Table) To UBound(Table)
       If IsNull(Table(i, 1)) = False Then mondico(Table(i, 1)) = ""
    Next i
     '--avec tri
      temp = mondico.keys
    Call tri2(temp, LBound(temp), UBound(temp))
    Range("C2:C" & UBound(temp)).Value = Application.WorksheetFunction.Transpose(temp)
    End Sub
     
    Sub tri2(a, gauc, droi)
    ' Quick sort
    On Error Resume Next
    For i = LBound(a) To UBound(a)
        If a(i) = "" Then
        a(i) = "-"
        End If
        If a(i) = "-" And Len(a(i)) = 1 Then
        a(i) = "1-"
        End If
        If InStr(a(i), "-") = 0 Then
        a(i) = "-" & a(i)
        End If
    Next i
    For k = 0 To UBound(a)
    For i = k To UBound(a)
        If CDbl(Split(a(k), "-")(0)) < CDbl(Split(a(i), "-")(0)) Then
        ElseIf CDbl(Split(a(k), "-")(0)) > CDbl(Split(a(i), "-")(0)) Then
                temp = a(k): a(k) = a(i): a(i) = temp
        ElseIf CDbl(Split(a(k), "-")(0)) = CDbl(Split(a(i), "-")(0)) Then
                If InStr(a(i), "-") >= 2 And InStr(a(k), "-") > 1 And CDbl(Split(a(k), "-")(1)) > CDbl(Split(a(i), "-")(1)) Then
                temp = a(k): a(k) = a(i): a(i) = temp
                End If
        End If
    Next i
    Next k
    For i = LBound(a) To UBound(a)
        If a(i) = "1-" And Len(a(i)) = 2 Then
        a(i) = "-"
        ElseIf InStr(a(i), "-") = 1 Then
        a(i) = Replace(a(i), "-", "")
        End If
    Next i
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Par défaut
    Bonjour Dirikorn,

    Pour accélérer une macro :
    1. Déclare TOUTES tes variables et leur type : ca prendra moins d'espace mémoire.
      Pour cela, place l'instruction Option Explicit (avant ta procédure) en tout début de macro. Celle-ci va t'obliger à déclarer toutes tes variables avant de compiler.
    2. Tu peux utiliser les instructions (dans ta procédure) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Application.ScreenUpdating = False
      Application.Calculation = xlCalculationManual
      afin de ne pas mettre à jour l'écran durant la macro ni faire de calcul pendant celle-ci.
      Tu devras donc remettre les bonnes valeurs en fin de macro :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Application.Calculation = xlCalculationAutomatic
      Application.ScreenUpdating = True

    Déjà effectue ceci !
    Cordialement,
    Kimy

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Par défaut
    Merci d'avoir répondu.
    Le fichier fourni est un fichier test. Le tri des valeurs n'est pas très long (<10 sec).
    Mais ce qui me dérange le plus, c'est que tant que le code n'est pas effectué, le user form ne s'affiche pas à l'écran. J'utilise les valeurs triés pour les afficher dans une combobox.

    Dans le bon fichier j'ai déjà appliqué les instructions d'optimisation suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Application.ScreenUpdating = False
    Application.DisplayStatusBar = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
    Par contre effectivement, je n'avais pas mis l'option explicit.
    Je suis en train de le faire et d'essayer de déclarer tous les types de mes variables.

Discussions similaires

  1. Tri par ordre croissant
    Par KinF dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 13/12/2008, 20h19
  2. Tri par ordre croissant
    Par identifiant_bidon dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/02/2008, 13h11
  3. Analyse croisée : empêcher le tri par ordre croissant
    Par mouaa dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 19/02/2008, 14h08
  4. Tri par ordre croissant
    Par controle55 dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/01/2008, 21h16

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