J'ai un petit problème pour supprimer des cellules vides
J'ai 2 colonnes de 7000 lignes dont les cellules sont obligatoirement au format texte. Dans l'une de ces colonnes, certaines cellules sont vides. Or, je dois détruire les lignes pour lesquelles des cellules sont vides. Mais Pour EXCEL, une cellule vide au format texte n'est pas .. une cellule vide !!!
Comment dois-je faire pour pouvoir réussir la manip editon/atteindre/cellules vides et supprimer ces lignes ?
Vous en remerciant par avance...
Pas certain de donner une réponse correcte sans voir le fichier (et son code) en question, mais vous pouvez essayer de tester les cellules concernées par
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
fin = Feuil1.Range("A65000").End(xlUp).Row
For i = fin To 1 Step -1
If Cells(i, 2) = "" Then Rows(i).EntireRow.Delete
Next
End Sub
Merci pour ta réponse cher Papou mais je ne comprends pas..
J'ai placé le code dans un module mais chaque fois, j'ai le message "erreur de compilation inatendu - erreur de syntaxe" sur la première ligne "worksheet_selectionchange... "
je replace a nouveau le tableau test en question
Cela ne peut effectivement pas fonctionner pour (au moins) deux raisons.
Dans votre classeur,
1) Le code n'est pas placé au bon endroit.
Vous avez placé la procédure dans un module de classe. Or, s'agissant d'une procédure évènementielle liée à un évènement de feuille (Worksheet_SelectionChange), elle doit être placée dans le module de la feuille à traiter.
2) Le code est incorrect.
Worksheet_SelectionChange(ByVal Target As Range) doit être précédé de Private Sub.
La procédure doit être terminée par End Sub
De plus, fin = Feuil1.Range("A65000").End(xlUp).Row
provoque une erreur si Feuil1 n'est pas une variable affectée.
Il faudrait par exemple avoir écrit avant : Set Feuil1 = Sheets("Feuil1")
Ou mieux, écrire : Sheets("Feuil1").Range("A65000").End(xlUp).Row
De plus, pourquoi se limiter à 65000 lignes ?
La procédure pourrait s'écrire simplement :
Code:
[COLOR="DarkSlateGray"][B]Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Long
For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
If Cells(i, 2) = "" Then Rows(i).EntireRow.Delete
Next
End Sub[/B][/COLOR]
à placer dans le module Feuil1. Ce faisant, cette procédure sera appelée à chaque changement de sélection d'une cellule de la feuille "Feuil1". Cela risque de ralentir considérablement le fonctionnement si vous avez un nombre élevé de lignes.
Enfin un telle procédure ne sera jamais exécutée en cliquant sur le bouton "supprimer lignes vides" que vous avez placé sur la feuille.
Je suggère de ne pas utiliser cette procédure évènementielle et d'utiliser celle-ci, placée dans un module standard :
Code:
[COLOR="DarkSlateGray"][B]Sub supprimer_lignes_vides()
Dim i As Long
With Sheets("Feuil1")
For i = .Cells(.Rows.Count, 1).End(xlUp).Row To 1 Step -1
If .Cells(i, 2) = "" Then .Rows(i).EntireRow.Delete
Next
End With
End Sub[/B][/COLOR]
Il vous suffira alors d'affecter cette procédure à votre bouton pour qu'elle s'exécute à la demande par un clic sur le bouton.
C'est ce qui est fait le classeur joint.
Bonjour Roger jeep le forum,
bon bah Roger à réglé ton problème mais je tiens à te dire que ma macro marche si tu la place dans la feuille et non pas dans un module comme l'avais fait
Pour l'action par un bouton oui cela dépend aussi de comment sont alimenté tes feuilles et de la fréquence.Si c'est une liste qui ne bouge pas un bouton est effectivement plus adapté.
bon dimanche à tous
Papou
Bonjour Roger jeep le forum,
bon bah Roger à réglé ton problème mais je tiens à te dire que ma macro marche si tu la place dans la feuille et non pas dans un module comme l'avais fait
Pour l'action par un bouton oui cela dépend aussi de comment sont alimenté tes feuilles et de la fréquence.Si c'est une liste qui ne bouge pas un bouton est effectivement plus adapté.
bon dimanche à tous
Papou
C'est vrai. Je me rends compte que mon précédent message n'est pas clair. Je faisais référence au classeur de jeep90 dans lequel la procédure n'était pas complète et, surtout, pas au bon endroit. Votre code, lui, placé dans le module de la feuille "Feuil1", et non pas dans un module de classe, fonctionne.
Or, en regardant rapidement la discussion sans trop faire attention, on pourrait croire que je parle de votre procédure. Je vais ajouter une petite ligne pour rendre la chose plus claire.
Bonjour Roger le forum,
non ne t'inquiète pas j'avais bien compris ton intervention.
A la lecture de tous tes posts, j'ai tellement à apprendre de toi, que tes remarques ne peuvent que faire avancer les choses pas l'inverse.
bon dimanche
Papou
EDIT: Roger, j'avais jamais vu que nous étions voisin !!
un grand merci à vous deux, c'est exactement cela et ca fonctionne très bien
Bon, déja que je débute avec les module et les SUB et END SUB, alors les PRIVATE SUB, pffff... ca me dépasse encore plus !!
Dommage que mon boss ne comprenne pas l'interet d'une formation en VBA pour son personnel
Grace à vous, j'avance et j'apprend pas à pas... encore merci