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


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2012
    Messages : 88
    Par défaut macro trop lente
    Bonjour j'ai besoin de votre aide,

    J'utilise une macro qui suite à une recherche V, me vire toutes lignes ou ya des #N/A, mais là étant donné qu'elle doit virer 7000 lignes, elle met bcp de temps à finir.
    Est ce qu'il y a pas une astuce, un code à intégrer pour qu'elle devienne rapide meme en cas d'un nombre important de lignes

    voici le code utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub suppressionLigne_SiErreur_NA()
        Dim x As Long
     
        For x = 65536 To 1 Step -1
     
            If WorksheetFunction.IsError(Range("AF" & x)) = True Then
                If CVErr(xlErrNA) = Range("AF" & x) Then _
                    Rows(x).EntireRow.Delete
            End If
        Next x
     
    End Sub
    Merci pour votre aide

  2. #2
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Bonjour,

    utiliser une boucle est souvent ce qu'il y a de plus lent !

    Plus rapide est d'utiliser un filtre puis de supprimer les lignes filtrées.
    Et encore plus rapide est de trier auparavant les lignes sur la colonne critère du filtre …


    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2012
    Messages : 88
    Par défaut
    C'est ce que j'ai fait au début, mais comme je l'ai fait juste avec l'enregistreur de macro, ca ma fait un énorme code
    j'ai pas faire un code pour dire ca en deux lignes..

    peux tu m'aider
    merci

  4. #4
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par ilissnmiden92 Voir le message
    C'est ce que j'ai fait au début, mais comme je l'ai fait juste avec l'enregistreur de macro, ca ma fait un énorme code
    j'ai pas faire un code pour dire ca en deux lignes..

    peux tu m'aider
    merci
    Poste ton code balisé (conformément aux règles du forum via l'icône #)
    accompagné d'un classeur exemple au format xlsx (sans code) …

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re j'ai trouvé!!!!
    bon ca y est

    en fait meme avec un find/find next bien conçu on aurais jamais eu un résultat
    déjà avec "#N/A"(erreur 2042)
    quand on fait cel.value on est déjà dans le jaune

    et comme find cherche par la valeur c'est walouh
    alors on va rester simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub SuppSiErr()
        'On bloque le rafraichissement (gain de temps)
        Application.ScreenUpdating = False
        'On pointe la feuille
        With Feuil1
             For Each cel In .UsedRange.Columns("AF").Cells   'on ne prend que le usedrange de la colonne AF 
            If IsError(cel) Then cel.EntireRow.Delete
            'If cel.Value = ""#N/A"" Then  'cette ligne plante pour la raison que j'ai cité plus haut 
            Next
        End With
        Application.ScreenUpdating = True
    End Sub
    autant pour moi pour "AF"
    voila testerdans xp et off 2003 w7 et off 2007
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut

    en gardant la trame de ton code, essai comme cela.

    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 suppressionLigne_SiErreur_NA()
        Dim x As Long
     
        'On bloque le rafraichissement (gain de temps)
        Application.ScreenUpdating = False
     
        'On pointe la feuille sur laquelle on travaille
        With Feuil1
     
            'On boucle de la dernière cellule non vide de la colonne AF à la 1ère cellule
            For x = .Cells(.Rows.Count).End(xlUp).Rows To 1 Step -1
                If IsError(.Cells(x, "AF")) = True Then
                    If CVErr(xlErrNA) = .Cells(x, "AF") Then .Cells(x, "AF").EntireRow.Delete 'ou .rows(x).delete
                End If
            Next x
     
        Application.ScreenUpdating = True
    End Sub
    [Edit]

    Sinon une autre solution (pas testée) à base de specialcells et de find pour limiter le temps de boucle mais je doute qu'il y ait un gros écart.
    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
    Sub SuppSiErr()
    Dim aCell As Range, TheCells As Range
     
        'On bloque le rafraichissement (gain de temps)
        Application.ScreenUpdating = False
     
        'On pointe la feuille
        With Feuil1
     
            'On pointe toutes les cellules contenant une formule
            Set TheCells = .Columns("AF").SpecialCells(xlCellTypeFormulas)
     
            'On recherche parmis ces cellule celles contenant une erreur
            Set aCell = TheCells.Find("#N/A", , , xlwholes)
     
            'On regarde si une correspondance a été trouvée et on boucle sur les autres cellules
            Do Until aCell Is Nothing
                'On supprime la ligne
                aCell.EntireRow.Delete
     
                'On continue la recherche
                Set aCell = TheCells.FindNext(aCell)
            Loop
        End With
     
        Application.ScreenUpdating = True
    End Sub

    Pour l'idée du filtre, tu peux à la suite du filtre utiliser Specialcells pour ne pointer que les cellules visibles et les supprimer d'un coup. Je n'aime pas trop l'utilisation du filtre, je laisse à Marc le soin de te proposer un code si le coeur lui en dit

    [/Edit]
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  7. #7
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2012
    Messages : 88
    Par défaut
    J'ai essayé ton code, j'ai un message d'erreur, "objet requis"

  8. #8
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    SAlut

    Quelle ligne ?
    je suppose, il faut adapter et mettre le codename de ta feuille

    J'ai édité le message précédent.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  9. #9
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2012
    Messages : 88
    Par défaut
    J'ai bien mis le nom de mon onglet, faut il mettre un code en particulier?

  10. #10
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut

    Désolé, j'avais oublié de fermer la balise With

    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 suppressionLigne_SiErreur_NA()
        Dim x As Long
     
        'On bloque le rafraichissement (gain de temps)
        Application.ScreenUpdating = False
     
        'On pointe la feuille sur laquelle on travaille
        With Feuil1
     
            'On boucle de la dernière cellule non vide de la colonne AF à la 1ère cellule
            For x = .Cells(.Rows.Count).End(xlUp).Rows To 1 Step -1
                If IsError(.Cells(x, "AF")) = True Then
                    If CVErr(xlErrNA) = .Cells(x, "AF") Then .Cells(x, "AF").EntireRow.Delete 'ou .rows(x).delete
                End If
            Next x
        End With
        Application.ScreenUpdating = True
    End Sub
    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  11. #11
    Membre chevronné
    Homme Profil pro
    Ingénieur Industrialisation
    Inscrit en
    Mai 2015
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Industrialisation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2015
    Messages : 222
    Par défaut
    Citation Envoyé par ilissnmiden92 Voir le message
    Bonjour j'ai besoin de votre aide,

    J'utilise une macro qui suite à une recherche V, me vire toutes lignes ou ya des #N/A, mais là étant donné qu'elle doit virer 7000 lignes, elle met bcp de temps à finir.
    Est ce qu'il y a pas une astuce, un code à intégrer pour qu'elle devienne rapide meme en cas d'un nombre important de lignes

    voici le code utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub suppressionLigne_SiErreur_NA()
        Dim x As Long
     
        For x = 65536 To 1 Step -1
     
            If WorksheetFunction.IsError(Range("AF" & x)) = True Then
                If CVErr(xlErrNA) = Range("AF" & x) Then _
                    Rows(x).EntireRow.Delete
            End If
        Next x
     
    End Sub
    Merci pour votre aide
    Afin d'accélérer pas mal la macro, tu pourrais, sinon, tout mémoriser puis tout supprimer d'un coup, au lieu de supprimer ligne par ligne.

    Par exemple

    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
    Dim rngASuppr As Range
    Dim cell As Range
     
    For Each cell In Range("AF1", Range("AF" & rows.Count).End(xlUp))
        If cell.Text Like "*N/A*" Then 'ou peu importe ta façon de vérifier, iserror ou comme tu le souhaites
            If rngASuppr Is Nothing Then
                Set rngASuppr = cell.EntireRow 'Si rngASuppr est encore vide, alors on ne peut pas utiliser Union(Nothing,cell.EntireRow) donc on l'initialise en disant que ça vaut toute la ligne
            Else
                Set rngASuppr = Union(rngASuppr, cell.EntireRow) 'Sinon, on y ajoute la nouvelle ligne trouvée
            End If
        End If
    Next cell
     
    '(Tu pourrais également utiliser find ou ce que tu veux, mais franchement pour quelques milliers de lignes, Excel va analyser extrêmement vite)
    rngASuppr.Delete 'Et tu supprimes tout à la fin :)
    Ce n'est pas forcément la meilleure méthode, je la propose juste comme ça...

    Quentin

Discussions similaires

  1. [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
  2. [XL-2003] macro trop lente
    Par tioch dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/07/2011, 08h48
  3. [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
  4. [XL-2003] Macro qui fonctionne mais c'est trop lent
    Par lululaberlu dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/08/2009, 12h02
  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