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 :

Supprimer/Masquer les lignes vides


Sujet :

Macros et VBA Excel

  1. #1
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut Supprimer/Masquer les lignes vides
    Je crois que le code a déjà été donné par SilkyRoad mais je ne l'ai pas retrouvé. Donc
    Le code suivant supprime les ligne vides mais en remplaçant Delete par Hidden = True, on se contente de les masquer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub SupprimerLesLignesVides()
    Dim NbLignes As Integer
        NbLignes = Range("A65535").End(xlUp).Row
     
        For i = NbLignes To 1 Step -1
            'supprimer ligne vide
            If Range("IV" & i).End(xlToLeft).Column = 1 And Cells(i, 1) = "" Then Rows(i).Delete 'ou .Hidden = True pour les masquer
        Next i
    End Sub

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Si la colonne A n'est pas remplie, il faut adapter NbLignes à la colonne la plus remplie... ou sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbLignes = Activesheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
    On peut également compter le nombre de cellules vides ou remplies, ou le nombre de cellules visiblement vides (vraiment vide ou contenant un texte vide "") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ' Avec prise en compte des textes vides "" -> cela revient donc au code de ouskel'n'or
    If Application.WorksheetFunction.CountBlank(Rows(i)) = 256 Then Rows(i).Delete
    ' ou
    If Application.WorksheetFunction.Count(Rows(i)) = 0 Then Rows(i).Delete
     
    ' Sans prise en compte des textes vides ""
    If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then Rows(i).Delete

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Hello dadavyvy, tu es de retour ?
    Le code que tu donnes utilise WorksheetFunction, et le problème rencontré ici par sebi78 était la lenteur de sa procédure.
    Je lui ai donc conseillé de regarder où un gugus donnait un code qui me paraissaît très sioux...
    Et le gugus, c'était lui, avec le code très sioux et tout et tout
    J'ai supposé que le problème de lenteur était dû à l'usage de WorksheetFunction dans son propre code et j'ai pondu le code ci-dessus qui lui est instantanné. Et je ne suis pas allé plus loin.
    Si tu as le temps, teste tout ça avec GetTickCount&
    A+

    Edit
    Et avec Empty au lieu de "", ce ne serait pas mieux ? Je teste.

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je viens de tester les deux solutions, celle de sebi78 et la mienne.
    Sur 119 lignes dont 35 lignes vides
    Le code de sebi, en millisecondes : 47 ms
    Le mien, toujours en millisecondes : 47 ms

    Et il va falloir que j'annonce ça à sebi
    Les codes utilisés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub sup_ligne_vid_2() 'Selon sebi78
    Dim i As Integer, Debut
        'Debut = GetTickCount& 'Ne sert qu'à mesurer le temps d'exécution
        Application.ScreenUpdating = False
            'boucle sur les lignes 100 à 1
            NbLignes = Range("A65535").End(xlUp).Row
            For i = NbLignes To 1 Step -1
                'supprimer ligne vide
                If Application.WorksheetFunction.CountA(Rows(i)) = Empty _
                Then Rows(i).Delete
            Next i
        Application.ScreenUpdating = True
        'MsgBox GetTickCount& - Debut  'Ne sert qu'à mesurer le temps d'exécution
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub SupprimerLesLignesVides()
    Dim NbLignes As long, i as long, Debut
    Application.ScreenUpdating = False
    'Debut = GetTickCount& 'Ne sert qu'à mesurer le temps d'exécution
        NbLignes = Range("A65535").End(xlUp).Row
     
        For i = NbLignes To 3 Step -1
            If Range("IV" & i).End(xlToLeft).Column = 1 And Cells(i, 1) = Empty Then Rows(i).Delete
        Next i
        Application.ScreenUpdating = True
    'MsgBox GetTickCount& - Debut  'Ne sert qu'à mesurer le temps d'exécution
    End Sub
    Dernière remarque : Bien qu'il n'y ait pas de sélection de ligne dans le code, l'utilisation de Application.screenUpdating = false fait gagner 141 ms aux procédures (47 au lieu de 188)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Points : 451
    Points
    451
    Par défaut
    Bonjour ousk',

    désolé je ne connaissais pas le véritable problème de gagner du temps...

    je suis tout à fait d'accord avec la solution de AlainTech ici posté le 13/05/07 à 4h48!
    Il faut, en plus de bloquer le ScreenUpdating, bloquer le recalcul automatique.

    Ensuite, pour éviter également de faire des delete un par un, tu peux aussi enregistrer dans une variable les différentes lignes à supprimer, et les supprimer toutes en une seule fois à la fin, avec un Union. Mais avec le ScreenUpdating=False et le Calculation=xlManual, ça ne devrait rien changer...

    M'enfin bon, avec 47ms je pense qu'il n'y a pas trop d'attente pour l'utilisateur...

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut C'était trop beau !
    Je suis d'accord avec toi. Mais j'ai ajouté une réponse incluant les différents aspects à envisager. Si tu veux y jeter un oeil ici
    Je compte sur toi pour me contredire le cas échéant. Merci

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Bon. Ici la solution la plus sioux donnée par Michel M, complétée selon les conseils d'AlainTech si présence de formules.
    Temps d'exécution sur le même fichier : 16 ms
    Seule condition nécessaire : les colonnes de la plage de données doivent toutes posséder un en-tête
    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
    Sub Suppression_Ligne_Vide()
    Dim dercol As Integer
    Dim NbLignes As long
     
        NbLignes = Range("A5").SpecialCells(xlCellTypeLastCell).Row
        dercol = Range("IV1").End(xlToLeft).Column
        Application.ScreenUpdating = False
            Application.Calculation = xlCalculationManual
     
            Cells.Range(Cells(5, dercol), Cells(NbLignes, dercol)).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
     
            Application.Calculation = xlCalculationAutomatic
        Application.ScreenUpdating = True
     
    End Sub
    Application.Calculation est utile si la plage de données contient des formules. Ne ralentit pas la procédure s'il n'y en a pas.

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut Masquer les lignes vides
    Inspiré d'une des solutions données ci-avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub MasquerLesLignesVides()
    Dim NbLignes As Long, i As Long, Debut
        Application.ScreenUpdating = False
            NbLignes = Range("A65535").End(xlUp).Row
     
            For i = NbLignes To 3 Step -1
                If Range("IV" & i).End(xlToLeft).Column = 1 And Cells(i, 1) = Empty _
                   Then Rows(i).Hidden = True
            Next i
     
        Application.ScreenUpdating = True
    End Sub

Discussions similaires

  1. Supprimer toutes les lignes vides
    Par Lorenzole+bo dans le forum Contribuez
    Réponses: 2
    Dernier message: 22/09/2008, 13h07
  2. [BO6.5.1] Masquer les lignes vides
    Par Herlece dans le forum Deski
    Réponses: 3
    Dernier message: 06/08/2008, 11h03
  3. Supprimer les lignes vides d'un document Word
    Par Jerfa dans le forum VBA Word
    Réponses: 4
    Dernier message: 28/08/2006, 16h12
  4. Réponses: 2
    Dernier message: 04/05/2006, 13h10
  5. supprimer les lignes vides?
    Par VinnieMc dans le forum Langage
    Réponses: 5
    Dernier message: 27/02/2006, 14h01

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