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 :

Macro Excel lente dans certains cas


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Inscrit en
    Juillet 2012
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 34
    Par défaut Macro Excel lente dans certains cas
    Hello,

    J'ai une petite macro dont le but est d'automatiser des opérations sur une feuille Excel et le contenu est essentiellement constitué de boucle de ce genre la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    With Worksheets("InputData")       
            For i = 2 To Cells(2, 1).CurrentRegion.rows.Count Step 1
                If something Then                
                    For j = i + 1 To Cells(2, 1).CurrentRegion.rows.Count Step 1
                        If something Then
                             doSomething
                        End If
                    Next
                End If
            Next
        End With
    La macro s'execute assez rapidement sur mon PC (environ 16 sec.) mais sur d'autres PC (pourtant aussi assez récents, utilisant aussi Excel 2010 et sur le même fichier) la macro dure environ 5 min!

    Quelqu'un saurait il pourquoi il y a une telle différence et comment résoudre ce problème de vitesse

    Merci
    Florent

  2. #2
    Membre éclairé Avatar de gnusti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 55
    Par défaut
    Bonjour,

    Pourquoi avoir mis ces deux For imbriqués ?

    Dans ton cas, pour traiter 10 lignes, tu fais 100 boucles...

    Mets un peu plus de détails sur ton code ça sera peut-être plus clair...

  3. #3
    Membre Expert Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Par défaut
    Salut,

    Outre la remarque de gnusti, il y a une astuce qui consiste à désactiver les calculs automatiques et rafraichissement de l'écran.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'En début de code
    application.screenupdating=false
    application.calculation=xlcalculationmanual
     
    'en fin de code
    application.screenupdating=true
    application.calculation = xlcalculationautomatic

  4. #4
    Membre averti
    Inscrit en
    Juillet 2012
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 34
    Par défaut
    OK, merci pour ces conseils

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Octobre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Distribution

    Informations forums :
    Inscription : Octobre 2012
    Messages : 3
    Par défaut
    Bonjour,

    Je suis tout a fait d'accord avec la remarque de gnusti, mais elle ne repond pas vraiment à la question.

    Par quelle aberration informatique une macro peut s'executer très correctement sous 2003 et se mettre à ramer maladivement sous 2010.
    J'ai mis une barre de progression qui m'a permis de constater que sous 2010, l'execution démarre à une vitesse comparable à 2003, mais elle ralenti de manière plus que significative à partir de 43%...

    mystères et spaghettis!!!

    Exemple d'une macro qui doit générer un fichier plat (30 000lignes et 78 colonnes) pour intégration dans une bdd ==> 10 mn avec 2003 / 53mn avec 2010!..


    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
    Sub mef_1()
    Sheets("exp").Columns("a:a").ClearContents
    témoin = True
    With Sheets("base_cat")
        .Activate
        li = .[a60000].End(xlUp).Row
        yy = 1
            For i = 3 To li
                F_BarreAttente.Show
                For j = 1 To 78
                xx = ""
                        If j = 10 Or j = 9 Or j = 8 Or j = 7 _
                        Or j = 6 Or j = 5 Or j = 4 Or j = 12 Then
                            n = .Cells(1, j)
                            m = Len(.Cells(i, j))
                            If m > n Then .Cells(i, j) = Left(.Cells(i, j), n)
                            m = Len(.Cells(i, j))
                            d = n - m
                            xx = .Cells(i, j)
                                If d <> 0 Then
                                    Do While d <> 0
                                        xx = xx & " "
                                        d = d - 1
                                        If d = 0 Then Exit Do
                                    Loop
                                End If
                                    xx = "'" & xx & "'" & ","
                        Else
                            If j = 78 Then
                                xx = .Cells(i, j)
                            Else
                                xx = .Cells(i, j) & ","
                            End If
                        End If
                        Sheets("exp").Cells(i - 2, 1) = Sheets("exp").Cells(i - 2, 1) & xx
                Next j
            p = p + 1 / li
            F_BarreAttente.Label1.Width = p * 100
            F_BarreAttente.Caption = Format(p, "0.0000%")
            DoEvents
            Next i
    End With
    témoin = False
    Unload F_BarreAttente
    End Sub

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

Discussions similaires

  1. Vous utilisez le goto dans certains cas ?
    Par b Oo dans le forum C++
    Réponses: 23
    Dernier message: 21/10/2006, 17h08
  2. Empecher la validation dans certains cas ?
    Par elitost dans le forum Struts 1
    Réponses: 2
    Dernier message: 19/09/2006, 13h03
  3. Passer la validation Javascript dans certains cas
    Par tkino dans le forum Struts 1
    Réponses: 2
    Dernier message: 31/07/2006, 15h37
  4. [JOINTURES] interêt dans certain cas
    Par nicotine002 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/06/2006, 17h22
  5. [POO] Modèle objet: this inutilisable dans certains cas?
    Par vlord dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 13/08/2005, 10h41

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