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 lignes vides dans un range donné [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Suppression de lignes vides dans un range donné
    Bonjour à tous,

    Je suis nouveau ici et après avoir parcouru tous les forums je n'arrive pas à trouver de solution à mon problème qui est le suivant :

    J'aimerais supprimer les lignes vides d'un range donné.

    En fait c'est pour un tableau type facture. Certaines lignes restent vides après modifications de la facture. Si ces lignes sont vides alors elles peuvent etre supprimées. Ces lignes sont en général dans un range allant de de C16 à I34.

    J'ai essayé avec le code ci dessous mais la première ligne en partant du haut se supprime quand je lance la macro :

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub sup_zero()
    Dim rcel As Range
    Range("C16:I34").Select
    Selection.CurrentRegion.Select
    For Each rcel In Selection
    If rcel.Value = "" Then
        rcel.EntireRow.Delete
    End If
    Next rcel
    End Sub

    Pourriez vous me donner un coup de main svp?

    Cordialement,
    Titi

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    deux remarques :

    - ton code supprime la ligne s'il trouve l'une des 7 cellules vide : il faut que les 7 cellules soient vide pour supprimer
    - il est toujours préférable de commencer par la ligne du bas et remonter : si tu supprimes la ligne 17, la ligne 18 prend la place de la ligne 17 ... donc ta macro va "sauter une ligne sur deux"

    voici une autre approche, testée et répondant à ton souhait

    il faut juste changer le nom de la feuille, j'ai utilisé "Feuil2" pour mes tests
    j'ai mis des commentaires pour comprendre

    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 sup_zero()
    Dim i As Long
    Dim Plage As Range
     
    ' on définit une plage pour l'ensemble des données
    Set Plage = Worksheets("Feuil2").Range("C16:I34")
    ' nombre de lignes de la plage
    nblig = Plage.Rows.Count
    nbcol = Plage.Columns.Count
     
    ' pour chaque ligne de la plage
    ' en commençant par la dernière
    For i = nblig To 1 Step -1
        ' si les 7 cellules sont vides
        If Application.WorksheetFunction.CountA(Range(Plage.Cells(i, 1), Plage.Cells(i, nbcol))) = 0 Then
            ' on supprime la ligne
            Worksheets("Feuil2").Rows(i + 15).Delete
        End If
    Next i
     
    End Sub

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup joe.levrai ! Cela fonctionne pour le range évoqué dans mon premier post..

    Par contre si je veux modifier le range je suis obligé de modifié également le Rows(i + 15) il me semble ? Pourrais tu m'expliquer à quoi cela sert dans le programme et comment dois je le modifier en // du Range que je souhaite étudier pour la suppression des lignes? Par exemple si je veux faire C30:I40 comment le Rows(i + xx) doit évoluer pour que le programme se déroule normalement?

    Cdt,
    Titi

  4. #4
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    tes données commencent en ligne 16

    en début de procédure, je prend ta plage et je la met dans une variable Plage
    je calcule le nombre de lignes et de colonnes que représente cette plage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set Plage = Worksheets("Feuil2").Range("C16:I34")
    nblig = Plage.Rows.Count
    nbcol = Plage.Columns.Count

    suite à cela, je fais une boucle sur les lignes de la variable Plage, je compte les cellules remplies pour chaque ligne
    si j'ai 0 cellule remplie ==> la ligne est vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = nblig To 1 Step -1
        ' si les 7 cellules sont vides
        If Application.WorksheetFunction.CountA(Range(Plage.Cells(i, 1), Plage.Cells(i, nbcol))) = 0 Then

    c'est à dire qu'en termes de lignes :

    - la ligne 1 de la variable plage, c'est la ligne 16 de la feuille excel
    - la ligne 2 de la variable plage, c'est la ligne 17 de la feuille excel
    - etc...

    ce qui revient à dire qu'il y a un décalage de 15 lignes entre "ligne x de la variable Plage" et "ligne x de la feuille excel"

    c'est la raison pour laquelle, quand je dois supprimer la ligne dans la feuille excel ... je suis obligé d'ajouter 15 au numero de la ligne de la variable Plage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' on supprime la ligne
     Worksheets("Feuil2").Rows(i + 15).Delete


    L'inconvénient que tu as parfaitement souligné, c'est que si un jour tu dois changer le positionnement de ta plage, tu es obligé de modifier ce chiffre 15

    voici donc une nouvelle version autonome, le chiffre 15 est remplacé par la variable Decalage, qui est calculée par la procédure, et correspond à la différence "Première ligne de la plage - 1"

    la seule chose que tu dois changer dans la procédure : c'est la plage de données qu'on affecte à la variable Plage en début de procédure
    tout le reste est géré automatiquement

    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
    Sub sup_zero()
    Dim i As Long
    Dim Plage As Range
    Dim Decalage As Long
     
    ' on définit une plage pour l'ensemble des données
    Set Plage = Worksheets("Feuil2").Range("C16:I34")
    ' nombre de lignes de la plage
    nblig = Plage.Rows.Count
    nbcol = Plage.Columns.Count
     
    ' décalage entre les lignes Excel et les lignes de la variable Plage
    Decalage = Plage.Cells(1, 1).Row - 1
     
    ' pour chaque ligne de la plage
    ' en commençant par la dernière
    For i = nblig To 1 Step -1
        ' si les 7 cellules sont vides
        If Application.WorksheetFunction.CountA(Range(Plage.Cells(i, 1), Plage.Cells(i, nbcol))) = 0 Then
            ' on supprime la ligne
            Worksheets("Feuil2").Rows(i + Decalage).Delete
        End If
    Next i
     
    End Sub

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Merci Joe pour cette description point par point du comment et pourquoi.

    Le code marche parfaitement merci beaucoup ! Cependant je me demandais si on pouvait donner un range de contenu plutot que de cellules contenant.

    Je m'explique..comme on l'a évoqué le range de C16:I34 risque fort de changer un jour si j'insère des lignes dans la facture ou au contraire si j'en enlève. Hors quelque chose qui ne changera jamais dans cette manip c'est qu'il faudra toujours supprimer les lignes vides qui sont entre les mots Abonnement (C16) et le mot Accessoire (I34). Donc ma question est la suivante :

    Est il possible de définir un range qui ca de la cellule "Abonnement" à la cellule "Accessoire" ?

    Comme cela meme si le nombre de ligne varient entre ces deux mots, le programme supprimera quoiqu'il arrive toutes les lignes vides comprises entres ces deux mots.

    Cdt,
    Titi

  6. #6
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 138
    Points : 9 972
    Points
    9 972
    Billets dans le blog
    5
    Par défaut
    en reformulant tes indications, il faut :


    - Pour remplacer le C16 du code, chercher dans la colonne C le mot "Abonnement" : c'est la première cellule de ta plage
    - Pour remplacer le I34 du code, chercher dans la colonne I le mot "Accessoire" : c'est la dernière cellule de ta plage


    et pour résumer, la question devient "peut-on tout automatiser avec uniquement la recherche de ces deux mots" ?

    la réponse est là :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Sub sup_zero()
    Dim Plage As Range, Debut As Range, Fin As Range
    Dim Decalage As Long, i As Long
     
    With Worksheets("Feuil2")
        ' on cherche les cellules contenant Abonnement (colonne C) et Accessoir (colonne I)
        Set Debut = .Columns(3).Find(What:="Abonnement", LookAt:=xlWhole)
        Set Fin = .Columns(9).Find(What:="Accessoire", LookAt:=xlWhole)
     
        ' si on a trouvé les deux cellules
        If Not Debut Is Nothing And Not Fin Is Nothing Then
     
            ' on définit une plage pour l'ensemble des données
            Set Plage = .Range(Debut, Fin)
     
            ' nombre de lignes de la plage
            nblig = Plage.Rows.Count
            nbcol = Plage.Columns.Count
     
            ' décalage entre les lignes Excel et les lignes de la variable Plage
            Decalage = Plage.Cells(1, 1).Row - 1
     
        'sinon
        Else
     
            ' message d'avertissement et arrêt de la procédure
            MsgBox ("Vérifiez vos données!" & vbCrLf & """Abonnement"" n'a pas été trouvé en Colonne C, ou ""Accessoire"" n'a pas été trouvé en colonne I")
            Exit Sub
        End If
     
        ' pour chaque ligne de la plage
        ' en commençant par la dernière
        For i = nblig To 1 Step -1
            ' si les 7 cellules sont vides
            If Application.WorksheetFunction.CountA(Range(Plage.Cells(i, 1), Plage.Cells(i, nbcol))) = 0 Then
                ' on supprime la ligne
                .Rows(i + Decalage).Delete
            End If
        Next i
    End With
     
    End Sub

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour Joe !

    Merci beaucoup le code marche parfaitement et c'est exactement ce qu'il me fallait. Merci aussi pour avoir pris le temps de me décrire chaque étape !

    Bonne journée !

    A bientôt,
    Titi

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

Discussions similaires

  1. [XL-2007] Compteur de lignes non vide dans un range et stockage dans variables
    Par octane dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/11/2011, 20h30
  2. [XL-2003] calcule le nombre de ligne non vide dans une colonne donnée
    Par aefmaaradji dans le forum Excel
    Réponses: 2
    Dernier message: 27/07/2010, 15h08
  3. Réponses: 4
    Dernier message: 22/07/2010, 15h46
  4. Suppression ligne vide d'un range
    Par coco21 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 03/08/2007, 14h02
  5. Réponses: 4
    Dernier message: 02/07/2004, 19h14

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