Supprimer des ligne dont certaines colonnes sont vides

bonjour,

je suis debutant en vba/macro sur excel,

j'aimerai supprimer des lignes dont certain champs sont vides.. pouvez-vous m'aider à réaliser un petit acro svp ?

d'avance merci pour votre aide

Salut et bienvenue sur le Forum,

Si tu avais placé ton fichier, ce serait plus facile de répondre par rapport à ton problème exact.

Voici un exemple – dans le fichier ci-joint - de ce que l’on peut faire :

Sub supprimer()
Dim i As Integer

Application.ScreenUpdating = False
For i = Range("A65536").End(xlUp).Row To 2 Step -1
    If Cells(i, 2) = "" Then Rows(i).Delete
Next
End Sub

Cordialament.

121nanog-v1.zip (9.48 Ko)

Bonjour à tous,

@Yvouille

Quelques petits conseils si je peux me permettre sur la solution que tu proposes.

1- maintenant que les limites d'Excel en termes de lignes ont été repoussées depuis la sortie d'Excel 2007 (1 048 576 exactement), il devient judicieux d'écrire :

Range("A" & Rows.Count).End(xlUp).Row

plutôt que

Range("A65536").End(xlUp).Row

2- En déclarant la variable i en integer, tu vas rencontrer une erreur de dépassement de capacité si le nombre de ligne dépasse 32767 (valeur max que peut prendre un Integer)

3- Par rapport à la méthode de supprimer une à une les lignes, cela peut devenir relativement long lorsque le nombre de lignes augmente considérablement.

Le code suivant fait la même chose avec un temps d'exécution un peu plus rapide, et prend un peu moins de place en mémoire étant donné qu'il n'y a que 2 lignes de code et aucune variable à déclarer :

Sub supprimer2()
    Application.ScreenUpdating = False
    Columns("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

Ce code fait simplement appel à la fonction Atteindre (F5) d'Excel en détectant les cellules vides d'une colonne et en effaçant les lignes correspondantes.

Il y a peut-être moyen d'aller encore plus vite en passant par des variables tableau mais cela dépendra des besoins...

merci pour vos codes

mais il me sort :" pas de cellules correspondantes" erreur 1004

mes colonnes à tester sont les C et D

y a t il qlq chose à modifier ?

merci

nanog,

Comme l'a suggéré Yvouille :

Yvouille a écrit :

Si tu avais placé ton fichier, ce serait plus facile de répondre par rapport à ton problème exact.

vba-new a écrit :

nanog,

Comme l'a suggéré Yvouille :

Yvouille a écrit :

Si tu avais placé ton fichier, ce serait plus facile de répondre par rapport à ton problème exact.

voila mon fichier : https://docs.google.com/file/d/0B50tWcwT10lhaWc1NTcteWFuOVE/edit?usp=sharing

merci

Salut,

Je n'arrive pas à ouvrir ton fichier. A chaque fois j'ai un message que la page est introuvable. Utiliser plutôt la possibilité de joindre un message par l'intermédiaire du Forum (selon l'image ci-dessous, éventuellement après avoir compressé ton fichier) ou utilise le site Cjoint.com.

Amicalement.

joindre un fichier c joint

Re-bonjour,

nanog a écrit :

j'aimerai supprimer des lignes dont certain champs sont vides

Les lignes de quelles feuilles et selon les champs vides de quelles colonnes veux-tu supprimer (définitivement ?) ?

A te relire.

revoici

j'ai réduis le nb de lignes dans ce fichier test, c'est donc les champs G et H qui sont à tester, si l'un des 2 champs est vide : supprimer la ligne..

tanx

Salut,

Sur ton dernier exemple, il n'y a pas de ligne à supprimer

J'ai placé dans le fichier ci-joint une macro pour traiter les colonnes G et H.

Sub supprimer()
Dim i As Integer

Application.ScreenUpdating = False
For i = Range("A65536").End(xlUp).Row To 2 Step -1
    If Cells(i, 7) = "" And Cells(i, 8) = "" Then Rows(i).Delete
Next
End Sub

Je crois que la solution de vba-new ci-dessous ne fonctionne pas pour plusieurs colonnes.

Columns("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

Cordialement.

36test-v1.xlsm (27.18 Ko)

Bonjour à tous,

Attention Yvouille, je maintiens ma remarque sur la déclaration en Integer, il vaut mieux la déclarer en Long dans notre cas.

De plus, il semblerait qu'excel convertit implicitement automatiquement en Long les variables déclarées en Integer !

C'est une des choses qu'il faut savoir lorsqu'on se penche un peu sur l'optimisation de code.

D'excellentes explications de mydearfriend ici


Yvouille a écrit :

Je crois que la solution de vba-new ci-dessous ne fonctionne pas pour plusieurs colonnes.

Columns("B:B").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

Effectivement. On pourrait adapter comme ça :
Columns("G:G").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Columns("H:H").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

Salut vba-new et merci pour tes explications,

J’avais déjà pensé utiliser ton idée de placer deux fois la ligne Columns("X:X").SpecialCells(xlCellTypeBlanks).EntireRow.Delete mais selon moi ça ne fonctionne pas : Tout d’abord toutes les lignes ayant la colonne G vide sont supprimées ; il ne reste alors plus qu’une ligne puis cette dernière ligne - ayant la colonne H vide - est également supprimée. Ou aurais-je mal compris ce que tu voulais dire ?

Je joins un fichier avec cette démonstration à l'attention de nanog.

Je présume qu’il doit également y avoir une solution avec des filtres, mais je suis persuadé que le code proposé en premier lieu satisfera pleinement notre ami nanog. Si celui-ci devait avoir des fichiers de plus de 30'000 lignes et que ma boucle durait vraiment trop longtemps, il nous l’aurait quand même fait savoir.

Cordialement.

26test-v2.xlsm (26.21 Ko)

merci beaucoup pour tous vos retours,

en effet j'ai découvert aussi la solution de filtre qui est tout bête et qui dépanne.. mais votre code me sera plus utile pour travailler pour finement. je vais donc tester ça, je prendrai le temps aussi pour comprendre les fonctions.. parce que pour le oment c'ets pas gagner et j'aimerai beaucoup savoir adapter vos qlq lignes

merci

Salut Nanog,

En fait je parlais d'une "solution avec des filtres" mais par macro et non pas avec les filtres traditionnels. Mais comme sous-entendu, ceci permettrait de gagner peut-être quelques secondes, mais est-ce bien nécessaire dans ton cas ?

Amicalement.

la rapidité n'est pas importante dans mon cas.

merci

j'aurai uniquement 2000 lignes à traiter

merci Yvouille

la macro fonctionne t bien

puis je abuser en posant la question suivante : que signifie :

For i = Range("A65536").End(xlUp).Row To 2 Step -1

il sélectionne 65536 lignes mais le reste comprends pas..

Une boucle «For …. Next» effectue une action répétitive un certain nombre de fois que tu dois déterminer.

Dans le code

For i = 2 To 4
Range(« A » & i) = 33
Next

la variable i prendra à chaque boucle une valeur différente, soit 2, puis 3, puis 4 et le chiffre 33 sera inscrit dans les cellules A2, A3 et A4.

Dans mon code, le début est déterminé par Range("A65536").End(xlUp).Row, instruction qui cherche en fait la dernière ligne non-vide en remontant depuis la cellule A65536 (vba-new préconisait de remonter depuis la dernière ligne, quelle que soit la version Excel, ça donnerait Range("A" & rows.count).End(xlUp).Row) et la fin est 2. Comme le début est plus grand que la fin, on va à l’envers en rajoutant Step – 1.

Dans ton fichier, avec l'instruction If Cells(i, 7) = "" And Cells(i, 8 ) = "" Then Rows(i).Delete, on passe alors en revue chaque ligne (chaque valeur de i). Si la dernière ligne est par exemple la 19, elle sera traitée en premier, puis la 18, puis la 17, ........... puis la 2 et c'est fini

Amicalement.

Salut Nanog,

Je trouve dommage que tu ne donnes plus signe de vie apparemment parce que tu n'as plus besoin de mes services Si tu veux savoir ce que je voulais dire par "autre solution par filtres VBA", tu peux aller voir le fil https://forum.excel-pratique.com/excel/masquer-les-lignes-qui-ne-correspondent-pas-a-des-criteres-m-t38232.html Sur le dernier fichier fourni à David « David_V2 », j’ai justement mis en place cette élimination de lignes inutiles de cette manière (David voulait ce travail en deux étapes, d’où les deux boutons).

Cordialement.

merci Yvouille!

z'inquietez pas je passe régulièrement lire les commentaires, j'ai juste pas eu le temps de regarder en détail, je prends mon temps car c'est pas super urgent pour le moment mais je vous oublie pas !

Merci encore pour ta relance, je suis un cours video de formation actuellement..

a bientot

Rechercher des sujets similaires à "supprimer ligne certaines colonnes vides"