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 trop lente à exécuter


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 8
    Par défaut Macro trop lente à exécuter
    Bonjour,

    Je suis en train de réaliser une macro sur un fichier que je mets à jour quotidiennement afin de m'éviter toutes les modifications manuelles. La macro entière fonctionne mais est fortement ralentie par une des tâches:
    Je veux remplacer les valeurs de la colonne W en fonction de celles de la colonne X. C'est à dire, si X1="11" alors W1="M". Si X2="12" alors W2="M+1".
    J'ai donc réalisé la macro suivante:

    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
    Sub Descendre_lignes()
    ActiveSheet.Select
     Dim A As Integer
     A = 3
     
     Do While Range("W" & A).Value > 0
     
     If Range("W" & A).Value = "11" Then
     Range("X" & A).Value = "M"
     Else
     If Range("W" & A).Value = "12" Then
    Range("X" & A).Value = "M+1"
    Else
     If Range("W" & A).Value = "1" Then
     Range("X" & A).Value = "M+2"
     Else
     If Range("W" & A).Value = "2" Then
     Range("X" & A).Value = "M+3"
     
     Else: Range("X" & A).Value = "Over"
    End If
    End If
    End If
    End If
     
     
    A = A + 1
     
     Loop
    Elle fonctionne mais est super lente, d'autant plus qu'il peut y'avoir jusqu'à 5000 lignes à traiter. Mes connaissances en VBA étant très limitées, est ce que quelqu'un saurait comment la "simplifier" ?
    Merci d'avance

    PS : Je sais bien qu'il serait plus facile d'utiliser une simple formule mais le but de cette macro est de tout automatiser et je dois également pouvoir effectuer des modifications sur la colonne W, ce qui casserait les formules.

  2. #2
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 192
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Peut-être juste désactiver l'écran, ça ferait gagner du temps

    au début du code, après Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Screenupdating = False

    à la fin du code, avant End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Screenupdating = True

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 8
    Par défaut
    Hello Tototiti,

    Merci pour ta réponse, je viens de tester c'est toujours aussi long ..

  4. #4
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 192
    Billets dans le blog
    2
    Par défaut
    ça ne devrait pas
    des formules se recalculent à chaque changement de valeur en colonne X ?

  5. #5
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 288
    Par défaut
    Salut
    Qu'entendez-vous par c'est lent ? Tout est question de point de vue, de machine, etc.
    De plus comment mesurez-vous la vitesse d'exécution ? A la louche ? Parce que vous n'avez même pas de Timer vous vous indiquer le temps d'exécution !
    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
    Sub testrapidite()
    Dim xlwbs As Worksheet
    Dim rng As Range, c As Range
    Dim i As Integer
    Dim start As Single
     
    Set xlwbs = Worksheets("Feuil1")
     
    With xlwbs
        Set rng = .Range("W2", .Cells(.Rows.Count, 23).End(xlUp))
    End With
     
    start = Timer
     
    For Each c In rng.Cells
    Select Case c
        Case "11"
            c.Offset(0, 1).Value = "M"
        Case "12"
            c.Offset(0, 1).Value = "M+1"
        Case "1"
            c.Offset(0, 1).Value = "M+2"
        Case "2"
            c.Offset(0, 1).Value = "M+3"
        Case Else
            c.Offset(0, 1).Value = "Over"
    End Select
    Next
    MsgBox "durée du traitement: " & Timer - start & " secondes"
    End Sub

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 8
    Par défaut
    @tototiti2008 Oui c'est ça. Ça le fait ligne par ligne. C'est pour ça que je cherchais une autre façon d'écrire la macro qui pourrait m'éviter de passer par loop (je pense que c'est la que ça bloque)

    @Hyperion13 Salut, la macro met environ 10 mn sur mon fichier test avec 1500 lignes. Je pense que c'est suffisamment long pour être considéré comme lent non ?

  7. #7
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 192
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    Adaptation du code de hyperion :


    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
    Sub testrapidite()
    Dim xlwbs As Worksheet
    Dim rng As Range, c As Range
    Dim i As Integer, Tabl
    Dim start As Single
     
    Set xlwbs = Worksheets("Feuil1")
     
    With xlwbs
        Tabl = .Range("W2", .Cells(.Rows.Count, 23).End(xlUp)).Value
    End With
     
    start = Timer
     
    For i = 1 To UBound(Tabl, 1)
    Select Case Tabl(i, 1)
        Case "11"
            Tabl(i, 1) = "M"
        Case "12"
            Tabl(i, 1) = "M+1"
        Case "1"
            Tabl(i, 1) = "M+2"
        Case "2"
            Tabl(i, 1) = "M+3"
        Case Else
            Tabl(i, 1) = "Over"
    End Select
    Next i
     
    xlwbs.Range("X2").Resize(UBound(Tabl, 1), 1).Value = Tabl
     
    MsgBox "durée du traitement: " & Timer - start & " secondes"
    End Sub

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 8
    Par défaut
    Je viens de tester le code il marche parfaitement en moins d'une seconde! Top merci beaucoup à vous 2 !

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

Discussions similaires

  1. macro trop lente
    Par ilissnmiden92 dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 18/07/2015, 09h55
  2. [XL-2007] Solutions pour macros trop lente
    Par pasterlouis dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/08/2013, 12h04
  3. [XL-2003] macro trop lente
    Par tioch dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/07/2011, 08h48
  4. [XL-2007] Boucles for imbriquées, macro trop lente
    Par Jambonpurée dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/06/2011, 18h25
  5. [XL-2007] macros trop lentes (85 onglets)
    Par dodo28 dans le forum Macros et VBA Excel
    Réponses: 36
    Dernier message: 16/04/2009, 21h20

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