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 :

Suppression de ligne lorsque la cellule est = 0, trop lent [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Par défaut Suppression de ligne lorsque la cellule est = 0, trop lent
    Bonjour,

    J'ai trouvé le code ci dessous pour supprimer les lignes de mon tableau lorsque les cellules de la colonne D sont égale à zéro.
    Le traitement est beaucoup trop long, avez vous une astuce ?
    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Sup()
        Dim compt as Integer
        compt = 2
        Do While compt <= 7000
            If Cells(compt,4).Value = 0 Then
                Cells(compt,4).EntireRow.Delete
            Else
                compt = compt + 1
            End if
        Loop
    End Sub

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Il faudrait commencer par désactiver le rafraîchissement de l'affichage pendant que tu supprime tes lignes
    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
    Sub Sup()
        Dim compt As Integer
        Application.ScreenUpdating = False
     
        compt = 2
     
        Do While compt <= 7000
            If Cells(compt, 4).Value = 0 Then
                Cells(compt, 4).EntireRow.Delete
            Else
                compt = compt + 1
            End If
        Loop
     
        Application.ScreenUpdating = True
    End Sub
    Ensuite en appliquant un filtre pour n'avoir que les lignes vides d'un coup et obtenir une Range qui tu pourra supprimer d'un coup.

    As tu des entêtes sur tes colonnes ?

  3. #3
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 344
    Par défaut
    Bonjour,


    Ta suppression risque de poser souci car tu fais une boucle progressive. Normalement, quand on supprime des lignes, il faut faire une boucle à l'envers :

    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
    Sub Sup()
        Dim compt As long
        Application.ScreenUpdating = False
     
        compt = 7000
     
        Do While compt > 0
            If Cells(compt, 4).Value = 0 Then
                rows(compt).Delete
            Else
                compt = compt - 1
            End If
        Loop
     
        Application.ScreenUpdating = True
    End Sub
    Après, effectivement comme l'a dit la personne ci-dessus, le mieux serait de faire une filtre sur ta 4e colonne, de façon à avoir tous les 0 regroupés. Tu pourras alors supprimer toute une plage de lignes à supprimer d'un coup, plutôt que de faire ligne par ligne.
    1. Avant de poster, et http://www.developpez.com/sources/
    2. Lors du post, n'oubliez pas, si besoin les balises CODE => voir ici pour l'utilisation
    3. N'oubliez pas le
    4. N'oubliez pas le si la réponse vous a été utile !

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une autre solution qui évite la boucle, est l'utilisation de la méthode AdvancedFilter de l'objet Range, combinée avec la méthode Delete des cellules vides (SpecialCells(xlCellTypeVisible).EntireRow.Delete)
    La suppression est instantanée

    Voir exemple dans ce billet Excel VBA – Supprimer des lignes suivant critères avec la méthode AdvancedFilter
    Pour en savoir plus sur les filtres avancés d'excel, lire ce tutoriel Les filtres avancés ou élaborés dans Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    en m'excusant auprès de Philippe qui, j'en suis convaincu, a raison (j'avais preparé, alors) et pour apprendre la manip des variables tableaux, à adapter
    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
    Sub Sup()
    Dim Tbl, DerCel As Range, x As Long, Result(), i As Long, y As Long
    With Sheets("Feuil1") 'à remplacer par le nom de ta feuille
      Set DerCel = .Range("D" & .Rows.Count).End(xlUp)
      ReDim Result(1 To DerCel.Row + 1, 1 To 4) '4 si 1ere colonne est en A, derniere colonne est D, 5 si E, 6 si F....
      Tbl = .Range("A2", DerCel) 'imaginons que ton tableau commence en A et termine en D, sinon .Range("A2", DerCel(1,5)) pour E etc.
      i = 1
      For x = 1 To UBound(Tbl, 1)
        If Val(Tbl(x, 4)) <> 0 Then
          For y = 1 To UBound(Tbl, 2)
            Result(i, y) = Tbl(x, y)
          Next y
          i = i + 1
        End If
      Next x
      .Range("A2", DerCel).ClearContents
      .Range("A2").Resize(UBound(Result, 1), UBound(Result, 2)) = Result
    End With
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Membre habitué
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 9
    Par défaut
    Merci pour toutes vos réponses.

    Je trouve que les traitements sont un peu long, j'ai opté pour un filtre avec suppression des lignes.

    Encore merci !

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

Discussions similaires

  1. [XL-2007] suppression de la ligne où la cellule est egale a 0 ou vide
    Par info009 dans le forum Excel
    Réponses: 2
    Dernier message: 27/05/2014, 15h10
  2. [XL-2007] Suppression de ligne si une cellule est vide
    Par cynoq dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/12/2011, 17h23
  3. ligne grisée lorsqu'une cellule est sélectionnée
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/10/2011, 10h40
  4. Copier ligne si une cellule est modifiée
    Par Billyboule dans le forum Excel
    Réponses: 7
    Dernier message: 05/12/2007, 14h25
  5. Suppression d'une ligne dont la cellule est vide
    Par dolphinus27 dans le forum Excel
    Réponses: 5
    Dernier message: 12/09/2007, 11h18

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