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 :

Optimisation suppression de ligne dans une feuille Excel [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2007
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2007
    Messages : 272
    Par défaut Optimisation suppression de ligne dans une feuille Excel
    Bonjour

    On est souvent confrontés à ce genre de problème, la suppression de lignes dans un tableau Excel.
    Quand nous avons 5 lignes tout va bien, mais supprimer 1000 lignes parmi 5000, c'est horriblement long.

    Le code suivant est destiné à créer un nouveau classeur cloné mais en ayant supprimé les lignes non "intéressantes" sur le fichier d'origine.

    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
    Function Vidage_Clone()
        Application.ScreenUpdating = False
        Worksheets("Base").Activate
     
        Range("Sel_Clone_Base").Select
        K = Range("NbVal").Value
        For I = 1 To K + 3
        ActiveCell.Offset(1, 0).Activate
        If ActiveCell.Text = "#N/A" Then
            Selection.EntireRow.Delete
            ActiveCell.Offset(-1, 0).Activate
            End If
            Next I
        Application.ScreenUpdating = False
        End Function
    Une proposition plus efficace de cette boucle interminable ?
    Par avance milles mercis.

    Bertrand

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Bonjour,

    une boucle decrementee sans activation =]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function Vidage_Clone()
        Application.ScreenUpdating = False
        Worksheets("Base").Activate
     
        Range("Sel_Clone_Base").Select
        K = Range("NbVal").Value
        For I = 5000 To 1 Step -1
     
            If Range("A" & i).Text = "#N/A" Then
                Range("A" & i).EntireRow.Delete
            End If
        Next I
        Application.ScreenUpdating = False
    End Function
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour: suggestions (très fortes):

    1. Passer par les specialCells pour ne sortir que les erreurs
    2. Filter sur la valeur recherchée et virer ce qui ressort, toujours en passant par les specialCells

    Dans les deux cas, c'est très rapide (je n'ai pas mis les Application.ScreenUpdating) car on procède en une seule passe .....

    Si ça peut contribuer ....

    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
    Sub DelErrLines()
     
    Dim SrcR As Range
     
    ' Initialisation
        Set SrcR = ActiveSheet.Range("A1").CurrentRegion 'A Adapter
        Debug.Print SrcR.Address
     
    ' Solution 1
        Set SrcR = ActiveSheet.Range("A1").CurrentRegion.SpecialCells(xlCellTypeFormulas, xlErrors)
        Debug.Print SrcR.Address
     
        SrcR.Delete
     
    ' Solution 2 (ici en utilisant un tableau: on filter et on vire le résultat du filtre)
        With ActiveSheet.ListObjects("Table2")
            .Range.AutoFilter Field:=3, Criteria1:="#VALUE!"   'A adapter
            Set SrcR = .DataBodyRange.SpecialCells(xlCellTypeVisible)
        End With
     
        Debug.Print SrcR.Address
        SrcR.Delete
     
    End Sub

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2007
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2007
    Messages : 272
    Par défaut
    Merci pour vos réponses.

    La boucle de Jean-Philippe marche et améliore mais n'est pas transcendante.

    Je suis parti avec les propositions de vinc_bilb
    et ai mis en œuvre cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function Vidage_Clone()
        Worksheets("Base").Activate
        Range("Sel_Clone_Base").Select  ' Ce nom indique la colonne sélection, si résultat = "N/A" je supprime
     
        LL = ActiveCell.Offset(1, 0)
        CC = ActiveCell.Column
        Nb = Range("NbVal").Value
     
        ActiveSheet.Range(Cells(LL, 1), Cells(LL, 1)).CurrentRegion.AutoFilter Field:=CC, Criteria1:="#N/A"
        Set SrcR = ActiveSheet.Range(Cells(LL, 1), Cells(LL + Nb - 1, 1)).SpecialCells(xlCellTypeVisible)
        SendKeys "{ENTER}", False
        SrcR.Delete
        ActiveSheet.ShowAllData
    Je suis bloqué sur le SrcR.Delete qui me demande si je veux supprimer les lignes entières.
    La réponse est bien évidemment Oui, mais le SendKeys n'a pas d'effet, je trouve peu de chose sur le SendKeys.

    Une piste ?

    Sinon, l'optimisation serait parfaite.

    Bertrand

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2007
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2007
    Messages : 272
    Par défaut
    Je m'empresse de répondre à mon interrogation, car j'ai trouvé la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function Vidage_Clone()
        Worksheets("Base").Activate
        Range("Sel_Clone_Base").Select  ' Ce nom indique la colonne sélection, si résultat = "N/A" je supprime
     
        LL = ActiveCell.Offset(1, 0).Row
        CC = ActiveCell.Column
        Nb = Range("NbVal").Value
     
        ActiveSheet.Range(Cells(LL, 1), Cells(LL, 1)).CurrentRegion.AutoFilter Field:=CC, Criteria1:="#N/A"
        Set SrcR = ActiveSheet.Range(Cells(LL, 1), Cells(LL + Nb - 1, 1)).SpecialCells(xlCellTypeVisible)
        'SendKeys "{ENTER}", False
        SrcR.EntireRow.Delete
        ActiveSheet.ShowAllData
    En effet, il suffisait que je précise EntireRow au moment du Delete.

    Merci beaucoup pour l'aide apportée.

    Je positionne résolu

  6. #6
    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 blepy !

    Rappel d'un post récent que tu as dû lire vu que tu as posté juste derrière !

    Allégement d'une suppression de lignes parmi plusieurs lignes

    _________________________________________________________________________________________________________
    Je suis Paris, Istanbul, Berlin, Nice, Bruxelles, Charlie, …

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

Discussions similaires

  1. Modifier la hauteur d'une ligne dans une feuille Excel
    Par Maxence45 dans le forum Excel
    Réponses: 1
    Dernier message: 23/11/2007, 06h41
  2. [VBA-E] Problème pour insérer des lignes dans une feuille Excel
    Par skystef dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/04/2007, 14h13
  3. [VBA-E] Colorier une ligne dans une feuille excel
    Par skyst3f dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/10/2006, 11h42
  4. [VBA-E]trie(suppression de doublons) dans une feuille excel
    Par TANIE dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/08/2006, 13h25
  5. Sélection de lignes dans une feuille Excel
    Par lerico dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/12/2005, 09h20

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