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 :

[VBA][Excel]supprimer des lignes vierges


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut [VBA][Excel]supprimer des lignes vierges
    Bonjour! Voilà, je ne suis absolument pas experte en VBA mais j'ai besoin d'aide pour "fabriquer" un programme. J'utilise pour le moment les macros par apprentissage, mais je vais avoir besoin d'aller faire des modifications dans le VB par la suite, pour les lier et construire des Userform.

    Ma demande:

    j'ai un tableau excel sur une feuille. Ce tableau a 7 colonnes et x lignes.
    Parmi toutes ces lignes, certaines sont vierges et je voudrais les supprimer.
    J'ai essayé en mettant un filtre sur les colonnes et sélectionné "vides", puis sélectionné les lignes vides pour les effacer, mais le pb est que j'ai également effacé des lignes qui n'étaient pas vierges mais qui se trouvaient entre, lors de ma sélection.

    Comment faire?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 290
    Points : 374
    Points
    374
    Par défaut
    Bonjour,
    Utilise ce code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub SupprimerLigne()
    Dim DernièreLigne As Long
    Dim r As Long
    DernièreLigne = ActiveSheet.UsedRange.Row - 1
    DernièreLigne = DernièreLigne + ActiveSheet.UsedRange.Rows.Count
    Application.ScreenUpdating = False
    For r = DernièreLigne To 1 Step -1
    If Application.WorksheetFunction.CountA(Rows(r)) = 0 Then
    Rows(r).Delete
    End If
    Next r
    End Sub
    jpleroisse

  3. #3
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Hello!
    Il semble que jpleroisse a été plus rapide que moi, mais comme j'ai pondu un petit truc, je te l'envoie quand même:
    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
     
    Sub SuppLigneVide()
        'On cherche la derniere ligne remplie du tableau
        DerniereLigne = Cells(32000, 1).End(xlUp).Row
        'On parcourt les lignes, de la 1 à la derniere
        For Ligne = 1 To DerniereLigne
            If CetteLigneEstVide(Ligne) Then
                Rows(Ligne).Delete Shift:=xlUp
            End If
        Next Ligne
    End Sub
     
    Function CetteLigneEstVide(ByVal NumLigne As Integer) As Boolean
        CetteLigneEstVide = True
        For i = 1 To 7
            If Not IsEmpty(Cells(NumLigne, i)) Then
                CetteLigneEstVide = False
                'MsgBox ("On passe à FALSE")
            End If
        Next i
    End Function
    Si tu ne comprends pas le code: la fonction cetteLigneEstVide renvoie "VRAI" ou "FAUX" selon que la ligne NumLigne est vide ou non (je vérifie les 7 premières colonnes).
    La procédure principale, qui fait le travail, détermine la dernière ligne remplie de la colonne 1 (ou A): la purge se fera jusqu'à cette ligne.
    On fait une boucle sur les lignes concernées, et à chaque fois, je teste si la ligne est vide, et si elle l'est, je la supprime.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    Merci leroissejp et Megaxel pour votre aide! Je n'aurais pas réussi à faire cette manipulation seule.

    Par contre, j'ai un souci.
    Megaxel, j'ai pris ta macro mais je ne comprend pas
    DerniereLigne = Cells(32000, 1).End(xlUp).Row

    Dans mon tableau, il y 119 lignes et 7 colonnes. Parmis ces 119 lignes donc, certaines sont vides (dans le menu d'Excel:Outils, Options, Affichage, Fenêtres, j'ai décoché Valeurs Zéro, pour que les lignes indiquant "0" soient complètement vides)

    Et quand dans VB je me positionne sur DerniereLigne (For Ligne = 1 To DerniereLigne), la valeur 90 apparaît alors qu'en fait je sais qu'il y a 119 lignes à mon tableau et pas 90.

    Que dois-je faire?

    Aussi, pour éviter le comptage de toutes les colonnes dans
    For i = 1 To 7
    j'ai remplacé par
    For i = 4 To 4
    car c'est dans la colonne 4 que je veux le "filtre"

  5. #5
    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 543
    Points
    15 543
    Par défaut
    DerniereLigne = Cells(32000, 1).End(xlUp).Row
    Pour avoir effectivement la dernière ligne avec cette méthode, tu dois te placer dans la colonne possédant le plus grand nombre de lignes renseignées
    Ton problème doit venir du fait que la colonne 1 n'est pas celle-ci

    Tu dis si ça pose problème, il y a peut-être une autre méthode adaptée pour trouver la "vraie" dernière ligne

    Ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 1 to NbColonnes
        if derniereLigne < Cells(32000, i).End(xlUp).Row  then
             DerniereLigne = Cells(32000, i).End(xlUp).Row 
        endif
    Next
    A+

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut
    J'ai un autre problème non résolu sur cette macro.

    Exemple: si la ligne 5 est vide alors elle est effacée étant donné que la macro le demande.
    Mais voilà, la ligne 6 (qui est vide aussi) dans le déroulement de la macro devient à son tour ligne 5, donc une ligne vierge.
    Hors le comptage dans la macro continue sans prendre en compte cette nouvelle ligne vierge (ligne 5, ex-6).
    Je suis donc obligée de demander d'éxecuter 4 ou 5 fois la macro pour avoir mon tableau comme je le souhaite.

    Quelqu'un a une solution?

    Merci

  7. #7
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Oui, m'sieur, moi!!!! Enfin, je crois:
    Essaie ça:
    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 SuppLigneVide()
        'On cherche la derniere ligne remplie du tableau
        DerniereLigne = Cells(32000, 1).End(xlUp).Row
        FinDeLaBoucle = DerniereLigne
        'On parcourt les lignes, de la 1 à la derniere
        For Ligne = 1 To FinDeLaBoucle
            If CetteLigneEstVide(Ligne) Then
                Rows(Ligne).Delete Shift:=xlUp
                Ligne = Ligne - 1
                DerniereLigne = DerniereLigne - 1
            End If
            If Ligne = DerniereLigne Then Exit For
        Next Ligne
    End Sub
    En fait, il faut aller "moins loin" que prévu au début dans la boucle.

  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 543
    Points
    15 543
    Par défaut
    Je reprends le code de megaxel
    Chaque fois qu'une ligne est vide, tu fais
    Pas vérifié mais tu peux faire ça pour nous ?

    A+

  9. #9
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Ce n'est pas tout à fait aussi simple techniquement: j'ai dû passer par une variable supplémentaire, car la borne de fin de la boucle ne peut pas se modifier en cours de traitement. Même si la valeur de la variable contenant la fin de la boucle est modifiée au cours du traitement, la boucle va jusqu'à la valeur qu'avait la variable au début. J'ai donc dû faire un test de sortie supplémentaire...
    Je ne sais pas si je suis très clair, mais ça a eu l'air de bien fonctionner quand je l'ai testé.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 36
    Points : 23
    Points
    23
    Par défaut


    Merci les amis, ça marche à la perfection!!!

    Je vais pouvoir vous demander plein de choses par la suite!



    Mon problème est

  11. #11
    Membre expérimenté Avatar de Megaxel
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    1 187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 1 187
    Points : 1 405
    Points
    1 405
    Par défaut
    Ok! Comme ça, tu pourras aussi remercier tous les autres membres actifs de ce forum, qui t'aideront à leur tour comme nous l'avons fait sur ce problème.
    Juste une remarque: dans ta première réponse, tu as modifié la boucle du test "ligne vide" pour faire
    Ça ne sert à rien. Supprime la boucle, et met juste "i = 4" au début.

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

Discussions similaires

  1. Probleme en VBA Excel : supprimer une ligne doublante
    Par yanly dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/07/2007, 13h54
  2. [VBA|Excel] Décaler des lignes
    Par quario dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/03/2007, 14h52
  3. VBA EXCEL - Copier des ligne vers un autre calseur.
    Par patine31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/03/2007, 12h46
  4. [VBA-Excel] copier des lignes de données d'un fichier à un autre
    Par ash_rmy dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/07/2006, 10h17
  5. [VBA EXCEL] Copier des lignes
    Par ben7777 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/07/2006, 18h22

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