[VBA Excel] Supprimer les colonnes vides

[Résolu/Fermé]
Signaler
Messages postés
30
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
1 août 2007
-
Messages postés
51
Date d'inscription
mercredi 1 avril 2009
Statut
Membre
Dernière intervention
18 mars 2015
-
Bonjour,

J'ai une feuille excel avec des colonnes vides. Je souhaiterai automatiser leur suppression en VBA. Ces colonnes peuvent être n'importe ou et le nombre de ligne est variable.

Merci
A voir également:

8 réponses

Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 524
bonjour ben7777

Faut des boucles For...

C'est vrai mais si je te donne la macro suivante, c'est plus efficace :

Sub sup_col_vides()
Dim c
For c = 256 To 1 Step -1
If Cells(65536, c).End(xlUp).Row = 1 Then Cells(1,c).EntireColumn.Delete
Next c
End Sub


Merci de me dire si cela fonctionne...
6
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
30
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
1 août 2007
2
nickel merci ;-)
Messages postés
11
Date d'inscription
mercredi 23 octobre 2013
Statut
Membre
Dernière intervention
26 avril 2016

Sub sup_col_vides()
Dim c
For c = 256 To 1 Step -1
If Cells(65536, c).End(xlUp).Row = 1 Then Cells(1,c).EntireColumn.Delete
Next c
End Sub

Bonjour,

une question quant à ce code qui fonctionne;
dans la condition, que veut dire =1 ?
Apparemment, il sous-entend que chaque cellule dans la colonne est vide en les lisant du bas vers le haut, mais je ne comprends pas cette notion;
pourquoi ne pas mettre isempty(cells65536,c).end(xlup).row) ?
merci
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 524
Ton isempty s'adresse à une valeur de résultat et ta "row" ne sera jamais vide.
Cells(65536, c).End(xlUp).Row a la valeur 1 lorsque toute la colonne est vide.
Messages postés
11
Date d'inscription
mercredi 23 octobre 2013
Statut
Membre
Dernière intervention
26 avril 2016

Bsr

Merci pour ta réponse Gbinfo, mais qu'est-ce qu'une valeur de résultat et aurait-on pu remplacer le 1 par true ?
Merci
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 524
Bonjour,

J'ai utilisé "une valeur de résultat" car pour isempty tu utilises une fonction de recherche de ligne qui donne un résultat qui a donc une valeur.
Si tu remplaces le 1 par true cela ne sert à rien de faire le test car la fonction renvoie un numéro de ligne qui ne sera jamais à false et donc tu supprimeras la t(totalité des colonnes de ta feuille.
Messages postés
11
Date d'inscription
mercredi 23 octobre 2013
Statut
Membre
Dernière intervention
26 avril 2016

Bsr

Donc si je comprends bien, le code demande la lecture des colonnes du classeur en "scrutant" chaque cellule de la colonne en remontant vers la première cellule de cette colonne;à partir du moment où il arrive à cette première cellule donc au "=1", il efface la colonne entière;et pour arriver à cette première cellule, il faut que toute les cellules soient vides et c'est là que je ne comprends pas(je ne vois pas cette instruction dans le code);de même, le fait d'arriver à cette première cellule, donc le résultat de 1 lui est retourné et il efface la colonne entièrement sans avoir "contrôlé" si cette dernière était vide ou pas ?
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 524
Bonjour,

Tu devrais utiliser un peu l'aide VBA où toutes les notions sont expliquées.

end(xlup) recherche en remontant la première cellule non vide de la colonne.
Messages postés
11
Date d'inscription
mercredi 23 octobre 2013
Statut
Membre
Dernière intervention
26 avril 2016

Bjr

ça y est, par ta dernière réponse, j'ai compris;c'est le end(xlup) qui remonte jusqu'à la dernière cellule non vide;s'il remonte jusqu'à la 1ère ligne, il renvoie 1 et donc toute la colonne est vide et bonne à être supprimée.

Ok merci
Messages postés
51
Date d'inscription
mercredi 1 avril 2009
Statut
Membre
Dernière intervention
18 mars 2015
1
Bonjour,

J'essaie de faire la même chose, pourtant simple, mais rien à faire. Je dois supprimer les colonnes remplies de 0 ou de vides, cependant il y a des "titres" en haut des colonnes mais ça n'a pas d'importance.

Que je fasse :

Sub delete()

Dim j as Integer

For j = 20 to 1 step -1
               If Cells (4, j).Value = 0 Then ActiveCell.EntiereColumn.Delete
Next j

End Sub


Ou bien :

Sub delete() 

Dim j As Integer
 
For j = 20 To 1 Step -1 
              If Cells(65536, c).End(xlUp).Row = 1 Then Cells(1,c).EntireColumn.Delete 
Next j

End Sub 


soit ca ne fait rien, soit ca me dit "propriété ou méthode non gérée par cet objet"...


Ou es-ce que j'ai faux ?


Merci
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 524
Bonjour,

Lorsque l'on veut utiliser vba il ne faut tout mélanger dans un mixer car cela ne peux pas fonctionner.

If Cells (4, j).Value = 0 Then ActiveCell.EntiereColumn.Delete
tu ne géres pas la cellule active : comment veux-tu avoir un résultat ?

If Cells(65536, c).End(xlUp).Row = 1 Then Cells(1,c).EntireColumn.Delete
Tu as une boucle sur j et tu utilmises c comme variable : comment veux-tu avoir un résultat ?

Utilises le code selon le principe où il a été créé et cela devrait fonctionner.
Messages postés
51
Date d'inscription
mercredi 1 avril 2009
Statut
Membre
Dernière intervention
18 mars 2015
1
Je sais bien que ce n'est pas la bonne variable, j'ai juste recopié mon code à la va-vite en faisant des copier-coller de texte plus haut, mon code se trouvant sur un autre PC.

Personnellement, je ne vois pas ce qui cloche dans
If Cells (4, j).Value = 0 Then ActiveCell.EntiereColumn.Delete

, qui me parait etre une instruction simple et logique en regard de choses beaucoup plus compliquées que j'ai pu faire. J'ai pris ce code dans un autre sujet ou il avait l'air de marcher pour les personnes en question. Le "tu ne gères pas la cellule active" ne m'avance pas beaucoup plus ! Je ne vois pas ce que tu veux dire.

Meme si je fais
Worksheets("OUTPUT").Cells(4, j).Select
If ActiveCell.Value = 0 then ActiveCell.EntiereRow.Delete

Il me dit "propriété ou méthode non gérée par cet objet", et pas de souci de compilation...


Pour le deuxiéme code, que j'utilise avec les bonnes variable, il me renvoit la meme erreur...

Pour info, dans mes colonnes a supprimer, les 3 premieres lignes sont du texte et le reste, des 0, d'ou le fait que je les teste à partir de la ligne 4.
Messages postés
14934
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 524
Bonjour,

Tu joues au mixeur comme je te disais et cela ne fonctionne pas en vba : il n'y a pas d'instructions faciles ou difficiles il faut utiliser les fonctions adaptées.

Pour le deuxiéme code, que j'utilise avec les bonnes variable,
Peut-être sauf que tu mélanges (mixeur encore!) des objets avec des propriétés inadaptées : il faut comprendre les objets pour les utiliser à bon escient car c'est vba qui a toujours raison !
Messages postés
51
Date d'inscription
mercredi 1 avril 2009
Statut
Membre
Dernière intervention
18 mars 2015
1
Bon, je vais ouvrir un nouveau sujet, c'est pas en tournant autour du pot sans dire clairement quelles solutions adopter que ca va m'avancer.
Messages postés
2056
Date d'inscription
dimanche 1 septembre 2002
Statut
Membre
Dernière intervention
15 février 2008
202
;-)

Faut des boucles For...

;-)