[VBA]Suppression de lignes en fonction de la valeur d'une cellule pour différent [Résolu]

Tokh 3 Messages postés jeudi 15 mai 2008Date d'inscription 16 mai 2008 Dernière intervention - 15 mai 2008 à 14:36 - Dernière réponse : cs_MPi 3872 Messages postés mardi 19 mars 2002Date d'inscription 13 juillet 2018 Dernière intervention
- 16 mai 2008 à 23:20
Bonjour à tous,

Déjà désolé si la question 'est pas au bon endroit, j'ai choisi de la mettre dans la section débutante vb.net et VB 2005 plutôt que dans la partie Visual Basic 6 / Langages dérivés / VBA étant donné que je débute totalement en VBA.

Je vous expose mon problème. J'aimerais, dans une feuille excel, parcourir toutes les cellules de certaines colonnes et pour chaque cellule, si celle-ci n'est pas vide, qu'il me supprime la ligne correspondante.

Voici l'extrait du code correspondant :
    Dim i, j As Integer

    Sheets("DROITS N0 N1 N2").Activate
    For i = 4 To nbColonnes
        For j = 2 To nbLignes
            If Not Cells(j, i).Value = Empty Then
                Rows(j).Delete Shift:=xlUp
            End If
        Next
    Next

Commme vous pouvez le voir j'ai décidé de commencer à la ligne 2 et la colonne 4. Autrement dit, je souhaite que cette boucle parcourt chaque cellule de la feuille à partir de la ligne 2 et la colonne 4 jusqu'à la dernière cellule de la colonne et de la ligne de la feuille.

nbColonnes et nbLignes correspondant à la dernière colonne et dernière ligne de ma feuille.
    nbColonnes = Cells.Find("*", Range("A1"), , , xlByColumns, xlPrevious).Column
    nbLignes = Cells.Find("*", Range("A1"), , , xlByRows, xlPrevious).Row

Cette petite boucle semble marcher. Cependant certaines lignes ne sont pas supprimées alors qu'elles devraient l'être puisque il y a une valeur dans une cellule de la colonne 4.

Pourriez vous m'aider à résoudre mon pb en m'indiquant mes erreurs svp?

Merci d'avance
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
mortalino 6812 Messages postés vendredi 16 décembre 2005Date d'inscription 21 décembre 2011 Dernière intervention - 15 mai 2008 à 20:50
3
Merci
salut,

lol f0xi

Pour ton souci, c'est simple. Pourquoi certaines lignes n'étaient pas supprimées ?
Tout simplement car il faut partir de la dernière ligne vers la première (il faut donc inverser ta boucle).

Exemple :
Ta boucle s'effectue, et PAF, ligne 4, elle n'est pas vide (donc là, j vaut 4).
Ton instruction delete supprime la ligne donc, jusque là logique. Mais que se passe-t-il à ce moment, la ligne qui était placé en 5eme position remonte d'une place, donc devient la 4eme.
Mais ta boucle, elle, continue. Donc j passe à 5, mais si la ligne de tout à l'heure faisait partie de la conition pour être effacée, elle passe à l'as.
Conclusion :

    Sheets("DROITS N0 N1 N2").Activate
    For i = 4 To nbColonnes
        <strike>For j = 2 To nbLignes</strike>
        For j = nbLignes To 2 Step -1
            If Not Cells(j, i).Value = Empty Then
                Rows(j).Delete Shift:=xlUp
            End If
        Next
    Next

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA

Merci mortalino 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 82 internautes ce mois-ci

Commenter la réponse de mortalino
lillith212 1231 Messages postés vendredi 16 novembre 2007Date d'inscription 16 juin 2009 Dernière intervention - 15 mai 2008 à 14:58
0
Merci
Bonjour,

Petite question, as tu fais un pas à pas en mettant des espions en essayant de voir pourquoi ces cellules ne sont pas effacées?

Remarque :
'-- C'est un mieux pour ta déclaration de variable
Dim i as integer
Dim j As Integer

SLB

---------------------------------------------------------------
Il faut beaucoup donner pour recevoir un tout petit peu...
---------------------------------------------------------------
Commenter la réponse de lillith212
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 15 mai 2008 à 15:36
0
Merci
"Déjà désolé si la question 'est pas au bon endroit, j'ai choisi de la
mettre dans la section débutante vb.net et VB 2005 plutôt que dans la
partie Visual Basic 6 / Langages dérivés / VBA étant donné que je
débute totalement en VBA."


parfaitement logique! moi quand je debutais en Delphi, je postais en C#\Debutant parce que bon, la loose quoi si on poste en Delphi alors qu'on est debutant.
C'est comme pour mon premier boulot, comme j'avais jamais fait de chantier d'electricité, j'ai bossé 4 mois dans un centre de recherche nucleaire pour me faire une premiere experience, mais finalement ça m'as pas trop servis sur les chantiers de savoir faire fonctionner un accelerateur de particules...

<hr size="2" width="100%" />
Commenter la réponse de f0xi
Tokh 3 Messages postés jeudi 15 mai 2008Date d'inscription 16 mai 2008 Dernière intervention - 15 mai 2008 à 15:38
0
Merci
Bonjour Lillith,

Merci pour ta réponse.
En cherchant, j'ai remplacé la ligne Rows(j).Delete Shift:=xlUp par
Rows(j).ClearContents

Il semblerait qu'avec cette ligne de code, toutes mes lignes ayant une valeur après la colonne 4 jusqu'à la colonne désirée soient effacées.
Il y a un donc un pb avec la ligne de code qui supprime la ligne plutôt que l'effacer.

Peut être une piste à travailler.
Commenter la réponse de Tokh
cs_MPi 3872 Messages postés mardi 19 mars 2002Date d'inscription 13 juillet 2018 Dernière intervention - 15 mai 2008 à 23:48
0
Merci
Il faudrait aussi savoir si tu effaces la ligne si une seule cellule de la ligne est vide ou si toutes les cellules doivent être vides...

De la façon dont la boucle est faite, tu commences par te placer en colonne 4 et tu vérifies toutes les lignes de cette colonne en effaçant au fur et à mesure. Ensuite, tu passes à la colonne 5 et tu refais toutes les lignes. Puis la colonne 6...

Essaie comme ceci si une seule cellule vide suffit pour effacer la ligne

    Dim I As Long, nbLignes As Long, nbColonnes As Long
   
    nbLignes = Cells(Rows.Count, ("A")).End(xlUp).Row
    nbColonnes = Cells(1, Columns.Count).End(xlToLeft).Column
   
    For I = nbLignes To 2 Step -1
        If WorksheetFunction.Count(Range(Cells(I, 4), Cells(I, nbColonnes))) < nbColonnes - 3 Then
            Rows(I).Delete
        End If
    Next

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
cs_MPi 3872 Messages postés mardi 19 mars 2002Date d'inscription 13 juillet 2018 Dernière intervention - 15 mai 2008 à 23:51
0
Merci
J'oubliais d'ajouter que si toutes les cellules à partir de D doivent être vides, il faut changer la condition pour celle-ci

If WorksheetFunction.Count(Range(Cells(I, 4), Cells(I, nbColonnes))) = 0 Then ...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
Tokh 3 Messages postés jeudi 15 mai 2008Date d'inscription 16 mai 2008 Dernière intervention - 16 mai 2008 à 15:17
0
Merci
Bonjour à tous,


Alors déjà merci à Mortalino pour son aide. Effectivement cela fonctionne correctement. J'ai même eu droit aux explication en prime, c'est parfait.


Merci aussi aux autres intervenants.


Enfin pour MPi. Effectivement je parcours chaque cellule de chaque colonne à partir de la quatrième et si une cellule de n'importe quelle colonne n'est pas vide alors la ligne est supprimée.
Commenter la réponse de Tokh
cs_MPi 3872 Messages postés mardi 19 mars 2002Date d'inscription 13 juillet 2018 Dernière intervention - 16 mai 2008 à 23:20
0
Merci
Alors, je pense que mon premier code sera plus rapide puisqu'il ne contient qu'une seule boucle, mais je n'ai pas testé la vitesse...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.