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

Excel Discussion :

Exécution de formule VBA trop lente [XL-365]


Sujet :

Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Par défaut Exécution de formule VBA trop lente
    Bonsoir à toutes et tous,

    J'ai un code qui fonctionne, elle sert à supprimer toute les lignes ou il y a des lettres dans une colonne spécifique. Sauf que cela met un temps fou à s'exécuter. Je ne vois pas comment améliorer cela. Si vous avez des idées ou pistes je suis preneur. Merci

    Le code :

    Sub SUPPRIMERLIGNE()
    Dim i As Integer
    Sheets("ACTIVITE JOUR").Select
    For i = 3 To Range("C9000").End(xlUp).Row

    If Not IsNumeric(Cells(i, 3)) Then
    Rows(i).Delete
    i = i - 1
    End If

    Next i

    End Sub

  2. #2
    Membre très actif
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 389
    Par défaut
    Bonjour,

    Une proposition en neutralisant le calcul et le rafraichissement de l'écran :

    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
    Sub SUPPRIMERLIGNE()
     
    Dim I As Long
    Dim HeureDebut
     
        HeureDebut = Timer
     
        With Application
             .ScreenUpdating = False
             .Calculation = xlCalculationManual
        End With
     
        With Sheets("ACTIVITE JOUR")
             For I = .Range("C9000").End(xlUp).Row To 3 Step -1
                 If Not IsNumeric(.Cells(I, 3)) Then .Rows(I).Delete
             Next I
        End With
     
        With Application
             .ScreenUpdating = True
             .Calculation = xlCalculationAutomatic
        End With
     
        Debug.Print Round(Timer - HeureDebut, 0) & " seconde(s)"
     
    End Sub

  3. #3
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 440
    Par défaut
    et si ce n'est pas encore assez rapide, une autre méthode expliquée dans ce post: delete-rows-from-table-macro-based-on-criteria. Traduction:
    Sur des ensembles de données volumineux comme celui-ci, je préfère utiliser des tableaux plutôt que de supprimer des lignes. Le concept est assez simple : vous chargez les valeurs de vos cellules cibles dans un tableau (Data), puis vous créez un deuxième tableau vide de même taille (NewData). Ensuite, vous parcourez les données et copiez toutes les lignes de données que vous souhaitez conserver dans la ligne vide suivante de NewData. Enfin, vous remplacez les valeurs de la cellule cible par NewData, supprimant ainsi les lignes que vous ne souhaitez pas conserver.
    mais cela devrait également être fait très rapidement en passant par PowerQuery.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Par défaut
    Citation Envoyé par E KERGRESSE Voir le message
    Bonjour,

    Une proposition en neutralisant le calcul et le rafraichissement de l'écran :

    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
    Sub SUPPRIMERLIGNE()
     
    Dim I As Long
    Dim HeureDebut
     
        HeureDebut = Timer
     
        With Application
             .ScreenUpdating = False
             .Calculation = xlCalculationManual
        End With
     
        With Sheets("ACTIVITE JOUR")
             For I = .Range("C9000").End(xlUp).Row To 3 Step -1
                 If Not IsNumeric(.Cells(I, 3)) Then .Rows(I).Delete
             Next I
        End With
     
        With Application
             .ScreenUpdating = True
             .Calculation = xlCalculationAutomatic
        End With
     
        Debug.Print Round(Timer - HeureDebut, 0) & " seconde(s)"
     
    End Sub
    Je ne comprends pas ton "Timer" tu peux m'expliquer stp?

  5. #5
    Membre très actif
    Homme Profil pro
    Auto entrepreneur
    Inscrit en
    Décembre 2021
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Auto entrepreneur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2021
    Messages : 389
    Par défaut
    C'est juste pour contrôler le temps de traitement, sinon il n'est pas utile.
    Le Debug.Print permet de faire apparaître la valeur dans la fenêtre exécution (Ctrl-G) dans l'éditeur VBA.

  6. #6
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 440
    Par défaut
    Les instructions utilisant Timer n'ont pas vraiment d'utilité et peuvent être supprimées. Elles sont juste là pour indiquer le temps qu'il a fallu à la routine pour s'exécuter.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 34
    Par défaut
    Citation Envoyé par E KERGRESSE Voir le message
    Bonjour,

    Une proposition en neutralisant le calcul et le rafraichissement de l'écran :

    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
    Sub SUPPRIMERLIGNE()
     
    Dim I As Long
    Dim HeureDebut
     
        HeureDebut = Timer
     
        With Application
             .ScreenUpdating = False
             .Calculation = xlCalculationManual
        End With
     
        With Sheets("ACTIVITE JOUR")
             For I = .Range("C9000").End(xlUp).Row To 3 Step -1
                 If Not IsNumeric(.Cells(I, 3)) Then .Rows(I).Delete
             Next I
        End With
     
        With Application
             .ScreenUpdating = True
             .Calculation = xlCalculationAutomatic
        End With
     
        Debug.Print Round(Timer - HeureDebut, 0) & " seconde(s)"
     
    End Sub
    Merci cela fonctionne déja plus rapidement que mon code. Je vais essayer aussi avecPowerQUery, que je ne connais pas du tout, voir si je peux encore améliorer la vitesse.

  8. #8
    Membre Expert
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    1 215
    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 215
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    à tester

    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
    Sub Test()
    Dim Lig As Long
        With Application
                 .ScreenUpdating = False
                 .Calculation = xlCalculationManual
        End With
        With Sheets("ACTIVITE JOUR")
            Lig = .Range("C" & Rows.Count).End(xlUp).Row
            .Activate
            .Range("C3:C" & Lig).Select
            Selection.SpecialCells(xlCellTypeConstants, 22).Select
            Selection.EntireRow.Delete
        End With
        With Application
                 .ScreenUpdating = True
                 .Calculation = xlCalculationAutomatic
        End With
    End Sub
    Si la colonne C contient des formules, remplacer xlCellTypeConstants par xlCellTypeFormulas

  9. #9
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 582
    Par défaut
    Citation Envoyé par tototiti2008 Voir le message
    Bonjour,
    Il faut bannir de tes codes les select, sélection et autres activate !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .Range("C3:C" & Lig).SpecialCells(xlCellTypeConstants, 22).EntireRow.Delete
    Sans avoir vérifié la véracité du code !

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

Discussions similaires

  1. [XL-2013] Temps d'exécution de macro vba trop lente ou à améliorer
    Par bpo2018 dans le forum Macros et VBA Excel
    Réponses: 26
    Dernier message: 28/06/2018, 18h25
  2. VBA temps d'exécution trop lent
    Par Jsainv dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 20/05/2013, 18h37
  3. [XL-MAC 2011] VBA trop lent
    Par NILS94 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/07/2011, 15h01
  4. Script vba excel trop lent
    Par zootman dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/07/2006, 14h27
  5. [VBA-E]temps d execution trop lent
    Par chmod777 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/03/2006, 15h10

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