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 une ligne si cellule vide ou = 0 dans une plage variable


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Supprimer une ligne si cellule vide ou = 0 dans une plage variable
    Bonsoir à tous,

    J'ai beau chercher dans le forum, je n'arrive pas à trouver réponse à mon problème.
    Je tiens à vous signaler que je suis débutant sur vba mais très intéressé pour augmenter en compétence !

    Je cherche à supprimer des lignes contenant une cellule vide ou bien si cette cellule est remplie du zéro (0).
    Le hic c'est que les colonnes tout comme les lignes peuvent varier !
    J'espère avoir été assez clair.

    Merci de votre aide ou de vos commentaires.

  2. #2
    Candidat au Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Pour info voici le code que j'utilisais que qui supprime même des lignes avec seulement des cellules pleines !?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub supp ()
    Dim cel_vide As Range
    Dim ad_cel As Integer
     
    For Each cel_vide In Range ("A1:AZ6000")
    If cel_vide.Value = "" Then
    ad_cel = Cel_vide.Row
    Rows(as_cel).Delete
    End If
    Next cel_vide
    End Sub

  3. #3
    Membre éclairé
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Points : 684
    Points
    684
    Par défaut
    Bonjour,

    voir ce lien pour la plage variable qui peut aider.

    http://www.developpez.net/forums/d45...ees-d-feuille/

  4. #4
    Candidat au Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci de ta réponse.
    J'ai bien lu le lien que je comprends plus ou moins.
    Mais dois-je définir une variable pour tel que:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim as DerniereLigne 
    DerniereLigne = Cells(Columns(1).Cells.Count, 1).End(xlUp).Row
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim as DerniereColonn
    DerniereColonne = Range("A1").SpecialCells(xlCellTypeLastCell).Column
    ?

    Merci

  5. #5
    Membre éclairé
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Points : 684
    Points
    684
    Par défaut
    comment doit se faire la suppression?


    - Par exemple si la plage est A1:C10 dès qu'il y a une cellule vide ou égale à 0 alors on supprime toute la ligne?
    - Ceci est valable pour chaque colonne ou une seule en particulier? si A1 est vide alors on supprime la ligne A et si B4 est vide alors on supprime la ligne4?
    - Si on doit le faire pour les cellules d'une colonne en particulier alors la varaible sera uniquement la dernière ligne

  6. #6
    Candidat au Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Non il n'y a pas de colonne en particulier.
    Oui c'est exactement ça.
    Imaginons la plage A1:C10
    S'il y a une cellule vide ou égale à zéro en B2 par exemple alors on supprime entièrement la ligne 2.
    Autre exemple, si en C4 il y a une cellule vide ou égale à zéro, alors on supprime entièrement la ligne 4.

    Merci de ta réponse, en espérant avoir été plus clair.

  7. #7
    Membre éclairé
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Points : 684
    Points
    684
    Par défaut
    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 test()
    Dim DerLig As Long, Dercol As Long, i As Long, j As Long
    Application.ScreenUpdating = False
    DerLig = Worksheets("test").UsedRange.SpecialCells(xlCellTypeLastCell).Row 'adapter
    Dercol = Worksheets("test").UsedRange.SpecialCells(xlCellTypeLastCell).Column 'adapter
    For i = DerLig To 1 Step -1
    For j = 1 To Dercol
    With ThisWorkbook.Worksheets("test") 'adapter
    If .Cells(i, j).Value = "" Or .Cells(i, j).Value = 0 Then
    Rows(.Cells(i, j).Row).Delete
    End If
    End With
    Next j
    Next i
    End Sub

  8. #8
    Candidat au Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta réponse rapide et ton aide.
    Alors j'ai essayé ta macro en adaptant le nom de la feuille.
    En l'exécutant, toutes les lignes sont supprimées à part les en têtes de colonnes.
    Je te joins le fichier pour preuve.
    Fichiers attachés Fichiers attachés

  9. #9
    Membre éclairé
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Points : 684
    Points
    684
    Par défaut
    bonjour,

    c'est normal... dès qu'une cellule de la plage est vide alors on supprime la ligne or la case commentaire est vide... donc on supprime...

    pour pallier au problème, il suffit de rajouter une autre condition au bloc if en lui disant qu'il ne faut pas tester sur la colonne commentaire (dans le fichier exemple c'est la 12)

  10. #10
    Candidat au Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour ta réponse. En effet je n'avais pas fait attention à la colonne commentaire ... toutes mes excuses.

    Je comprends bien ce que tu me dis mais mes compétences sont limités.

    Alors j'ai cherché un peu mais je bloque quand même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if .column(12)="" then (c'est la ou je bloque, je ne trouve pas la commande pour dire de ne pas exécuter la macro)
    end if

  11. #11
    Membre éclairé
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Points : 684
    Points
    684
    Par défaut
    Je tiens à vous signaler que je suis débutant sur vba mais très intéressé pour augmenter en compétence !
    alors comprends tu au moins le code proposé?

    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 test()
    Dim DerLig As Long, Dercol As Long, i As Long, j As Long 'déclare les variables en type long
    Application.ScreenUpdating = False 'arret du rafraichissement d'écran
    DerLig = Worksheets("test").UsedRange.SpecialCells(xlCellTypeLastCell).Row  'trouve la dernière ligne
    Dercol = Worksheets("test").UsedRange.SpecialCells(xlCellTypeLastCell).Column  'trouve la dernière colonne
    For i = DerLig To 1 Step -1  ' boucle de i allant de la dernière ligne à la première car step -1
    For j = 1 To Dercol 'boucle pour j allant de la première colonne à la dernière colonne
    With ThisWorkbook.Worksheets("test") 'pour ce calsseur feuille test
    If .Cells(i, j).Value = "" Or .Cells(i, j).Value = 0 Then 'si la cellule de ce classeur en feuille test cellule(ligne i, colonne j) == vide ou 0 alors
    Rows(.Cells(i, j).Row).Delete 'supprime la ligne i en cours de test
    End If ' fin de condition
    End With 'fin bloc with
    Next j 'valeur de j suivante donc colonne +1
    Next i 'valeur de i suivante une fois toutes les colonne testée donc ligne -1 car step -1
    End Sub
    avec ces commentaires, il est facile de trouver la condition manquante, on ne veut pas que le test se fasse sur la colonne commentaire donc la colonne 12 donc il faut pas faire le test pour une valeur de j=12...

    vois tu le code maintenant? tout se passe à cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If .Cells(i, j).Value = "" Or .Cells(i, j).Value = 0 Then

  12. #12
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 936
    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 : 12 936
    Points : 28 932
    Points
    28 932
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une autre solution qui remplace les valeurs nulles par rien et ensuite supprime les lignes entières où se trouve des cellules vides.
    Nous sommes obligés d'utiliser une boucle sur les colonnes car quand il y a superposition de cellules le code bogue, alors que cela fonctionne manuellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub t()
     Dim rng As Range, c As Integer
     Set rng = ThisWorkbook.Worksheets("db").Range("A1:C1000")
     With rng
      .Replace "0", "", xlWhole
      For c = 1 To .Columns.Count
      .Columns(c).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
      Next
     End With
    End Sub

  13. #13
    Candidat au Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci bboy-eazy encore une fois de ton aide.
    Alors oui avec tes commentaires (ca aide beaucoup!) je comprends bien le code.
    Ensuite j'ai compris que je devais faire une autre condition pour ne pas exécuter la macro sur la colonne 12.
    Etant donné mes compétences limitées, dois-je ajouter un autre[CODE]if[CODE] ou seulement un après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If .Cells(i, j).Value = "" Or .Cells(i, j).Value = 0 Then 'si la cellule de ce classeur en feuille test cellule(ligne i, colonne j) == vide ou 0 alors
    Rows(.Cells(i, j).Row).Delete 'supprime la ligne i en cours de test
    ?

    Mais si je comprends bien ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If .Cells(i, 12).Value = "" Or .Cells(i, 12).Value = 0 Then
    ne pas supprimer la ligne.

    Le raisonnement est-il bon ?

  14. #14
    Candidat au Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Mertci de ta réponse, mais Peux-tu m'expliquer cette ligne stp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    =For c = 1 To .Columns.Count
      .Columns(c).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
      Next
     End With
    End Sub

  15. #15
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 936
    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 : 12 936
    Points : 28 932
    Points
    28 932
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Mertci de ta réponse, mais Peux-tu m'expliquer cette ligne stp ?
    Tu écris "cette ligne" mais tu en affiches cinq.
    C'est une boucle sur les trois colonnes de la plage A1:C1000 de la feuille nommée db et qui supprime la ligne entière des cellules vides sélectionnées.

  16. #16
    Membre éclairé
    Homme Profil pro
    autodidacte
    Inscrit en
    Novembre 2013
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2013
    Messages : 517
    Points : 684
    Points
    684
    Par défaut
    non il faut simplement que le test ne se fasse pas sur la colonne 12 donc quand j prendra la valeur 12 et pour ce faire il faut ajouter une condition ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (.Cells(i, j).Value = "" Or .Cells(i, j).Value = 0) And j <> 12 Then ' si la cellule ligne i et colonne j = 0 ou est vide ET que j est différent de 12 alors ...
    du coup le code devient:
    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 test()
    Dim DerLig As Long, Dercol As Long, i As Long, j As Long 'déclare les variables en type long
    Application.ScreenUpdating = False 'arret du rafraichissement d'écran
    DerLig = Worksheets("test").UsedRange.SpecialCells(xlCellTypeLastCell).Row  'trouve la dernière ligne
    Dercol = Worksheets("test").UsedRange.SpecialCells(xlCellTypeLastCell).Column  'trouve la dernière colonne
    For i = DerLig To 1 Step -1  ' boucle de i allant de la dernière ligne à la première car step -1
    For j = 1 To Dercol 'boucle pour j allant de la première colonne à la dernière colonne
    With ThisWorkbook.Worksheets("test") 'pour ce calsseur feuille test
    If (.Cells(i, j).Value = "" Or .Cells(i, j).Value = 0) And j <> 12 Then 'si la cellule de ce classeur en feuille test cellule(ligne i, colonne j) = vide ou 0 ET QUE j est différent de 12 alors...
    Rows(.Cells(i, j).Row).Delete 'supprime la ligne i en cours de test
    End If ' fin de condition
    End With 'fin bloc with
    Next j 'valeur de j suivante donc colonne +1
    Next i 'valeur de i suivante une fois toutes les colonne testée donc ligne -1 car step -1
    End Sub

    pour ce qui est du code de Philippe,

    la partie d'avant remplace les 0 par des cellules vides
    ensuite on recheche les cellules vide de chaque colonne et on supprime la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    =For c = 1 To .Columns.Count 'pour c allant de 1 à la dernière colonne (.columq.count)
    .Columns(c).SpecialCells(xlCellTypeBlanks).EntireRow.Delete ' on supprime la ligne entière pour les cellules trouvées qui sont vides (xlCellTypeBlanks) en colonne c
    Next 'valeur de c suivante soit c+1

  17. #17
    Candidat au Club
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup bboys-eazy, cela fonctionne très bien et je comprends un (tout petit peu) mieux le vba grâce à toi.
    Et merci d’insérer des commentaires dans tes codes cela aide grandement les débutant comme moi.
    Mais bon, on est tous partis de presque zéro n'est-ce pas ?
    J'ai une autre question cependant!
    Imaginons que la colonne "commentaire"(12) se retrouve un jour en colonne (10)
    Peut-on dans le code prendre en compte l'en tête de colonne soit "commentaire" au lieu du numéro de colonne ?

    Philippe, oui désolé je voulais mettre cette "grande" ligne !
    Mais faut il que la plage soit exactement celle-la pour que la macro fonctionne ?
    Car sinon j'ai une erreur 1004, pas de cellule correspondante.

  18. #18
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 936
    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 : 12 936
    Points : 28 932
    Points
    28 932
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Mais faut il que la plage soit exactement celle-la pour que la macro fonctionne ?
    Car sinon j'ai une erreur 1004, pas de cellule correspondante.
    Bien sûr que non, c'était un simple exemple à adapter à ta situation. Il suffit de donner le nom de la feuille et la plage concernée.
    En général, j'utilise la propriété CurrentRegion pour délimiter dynamiquement une plage de données mais comme dans ce cas précis il est possible d'avoir une ligne complète vide, cela ne fonctionnerait pas.
    Pour connaître les différentes possibilités de délimiter dynamiquement une plage voir la FAQ ou le lien proposé par bboy-eazy en début de discussion

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/02/2010, 03h45
  2. Réponses: 1
    Dernier message: 26/09/2008, 16h38
  3. Réponses: 2
    Dernier message: 15/09/2008, 11h42
  4. Réponses: 3
    Dernier message: 04/07/2008, 12h00
  5. Réponses: 3
    Dernier message: 30/04/2007, 12h22

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