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 :

Code VBA très lent - en phase d'execution


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Août 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Code VBA très lent - en phase d'execution
    Est-ce que quelqu'un saurait identifier pourquoi mon code VBA est si long lorsque je le lance (en moyenne 5 minutes entre le moment où je clique "run" et le moment où il a terminé ?).

    Voilà le code :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Sub PODM()
    '
    ' PODM Macro
    ' Macro recorded 31/07/2008 by Leslie Petrequin
    '
     
        Sheets("PODM3").Select
     
        Cells.Select
        Selection.Delete Shift:=xlUp
     
        Sheets("PODM2").Select
        ActiveWindow.ScrollRow = 1
        Columns("D:I").Select
        Selection.Copy
     
        Sheets("PODM3").Select
        Cells.Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False
        Selection.Replace What:="0", Replacement:="", LookAt:=xlWhole, _
            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
            ReplaceFormat:=False
     
        Application.Run "efface_A_vide"
     
        Columns("C:C").Select
        Selection.Insert Shift:=xlToRight
        Range("C1").Select
        ActiveCell.FormulaR1C1 = "concatene"
        With ActiveCell.Characters(Start:=1, Length:=9).Font
            .Name = "Arial"
            .FontStyle = "Italic"
            .Size = 8
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .ColorIndex = 2
        End With
     
        Sheets("PODM3").Select
        Range("C2").Select
        ActiveCell.FormulaR1C1 = "=CLEAN(RC[-2]&RC[-1])"
        Selection.AutoFill Destination:=Range("C2:C" & Range("A2").End(xlDown).Row), Type:=xlFillDefault
     
        Range(ActiveCell, ActiveCell.End(xlDown)).Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
     
     
        Columns("C:C").Select
        ActiveWorkbook.Names.Add Name:="concatenecountryskugen", RefersToR1C1:= _
            "=PODM3!C3"
     
    End Sub
     
     
    Perut-être est ce que ça vient de ce bout de code qui correspond à     "efface_A_vide" ?
    Sub efface_A_vide()
    Application.ScreenUpdating = False
     
    Dim l As Integer
    For l = Cells(65256, 1).End(xlUp).Row To 1 Step -1
    If Cells(l, 1).Value = "" Then Cells(l, 1).EntireRow.Delete
    Next l
     
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
     
     
    End Sub

    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 128
    Points : 55 940
    Points
    55 940
    Billets dans le blog
    131
    Par défaut
    Bonjour et bienvenue sur nos forums.

    Le code est largement optimisable, dans la mesure où il n'est pas nécessaire de sélectionner des cellules pour les manipuler...

    De plus, une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.screenupdating = false
    en début de procédure et une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    application.screenupdating = true
    en fin de procédure élimera les rafraichissements d'écran (et les clignotements...)

    On pourrait aussi passer en calcul manuel durant le procédure, mais il faut y aller prudemment et analyser si le code n'a pas besoin d'un recalcul à un moment donné.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut Fairyanna et le forum
    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
    Sub PODM()
    Sheets("PODM3").Activate
    UsedRange.Delete
    Sheets("PODM2").Range("D:I").Copy
    Range("A1").PasteSpecial Paste:=xlPasteValues
    Range("A1").PasteSpecial Paste:=xlPasteFormats
    Range("A1").Replace What:="0", Replacement:="", LookAt:=xlWhole, _
                                                SearchOrder:=xlByRows
    Call efface_A_vide
    Columns("C:C").Insert Shift:=xlToRight
    Range("C1").FormulaR1C1 = "concatene"
    With Range("C1").Characters(Start:=1, Length:=9).Font
        .Name = "Arial"
        .FontStyle = "Italic"
        .Size = 8
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = 2
    End With
    Range("C2").FormulaR1C1 = "=CLEAN(RC[-2]&RC[-1])"
    Range("C2").AutoFill Destination:=Range("C2:C" & _
                 Range("A2").End(xlDown).Row), Type:=xlFillDefault
    Columns(3).Copy
    Columns(3).PasteSpecial Paste:=xlPasteValues
    ActiveWorkbook.Names.Add Name:="concatenecountryskugen", _
           RefersToR1C1:="=PODM3!C3"
    End Sub
    Sub efface_A_vide()
    Dim l As Long
    Application.ScreenUpdating = False
    For l = [A65256].End(xlUp).Row To 1 Step -1
        If Cells(l, "A") = "" Then Rows(l).Delete
    Next l
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    End Sub
    Pour moi, pas d'erreur flagrante qui pourrait ralentir dans ton code. Peut-être un problème de taille de ménoire ?
    A+

  4. #4
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    Salut,

    le code de Gorfael m'a l'air plutot pas mal.

    Petite question concernant l'appli efface_a_vide, as-tu besoin de partir de la ligne 65256 ?
    Ou veux-tu etre sur de prendre toute les lignes ayant au moins une cellule non vide ?

    Dans ce cas tu peux utiliser un SpecialCells(xlTypeLastCell), si tu n'as que 150 ligne à parcourir ça ira plus vite que de vérifier toute les cellules de la plage...

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut ancel17 et le forum
    Petite question concernant l'appli efface_a_vide, as-tu besoin de partir de la ligne 65256 ?
    J'ai compris la macro comme la feuille ayant en colonne A des formule jusqu'à la dernière (utilisation de Range("A2").End(xlDown).Row dans le code fourni, donc méthode End connue).
    Mais je peux me tromper.
    A+

  6. #6
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    En fait, à partir du moment ou un code comporte plein de 'Select', il faut s'attendre à voir l'exécution ralentie. Les solutions proposées sont à priori toutes les deux bonnes, soient :

    • Éliminer tous les Select en faisant les opérations directement sur les feuilles et leurs objets Range,
    • Débuter le traitement par une désactivation du 'ScreenUpdating' et en terminant par son activation (retour à la normale).

Discussions similaires

  1. [XL-2003] Macro VBA très lente, comment l'optimiser
    Par nuphius dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 17/06/2015, 22h45
  2. Executer du code vba apres un publipostage
    Par xcbilx dans le forum VBA Word
    Réponses: 6
    Dernier message: 10/04/2008, 01h53
  3. Temps d'execution très lent
    Par bahiatoon dans le forum C++Builder
    Réponses: 16
    Dernier message: 20/07/2007, 00h45
  4. [VB.Net 1.1/ASP.Net/Excel] Pourquoi mon exécution de code est si lente ?
    Par calison3 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 12/08/2006, 13h41
  5. probleme code vba ne s'execute pas apres instruction sql
    Par arnogef dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 29/12/2005, 13h34

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