aujourd'hui j'ai besoin d'aide pour supprimer toutes les lignes vides d'un fichier Excel MAIS en ne commençant qu'à partir de la colonne B.
Actuellement mon code est:
Code:
Application.ScreenUpdating = False
For n = ActiveSheet.UsedRange.Rows.Count To 1 Step -1
If Range("B" & n) = "" And Range("C" & n) = "" And Range("D" & n) = "" And Range("E" & n) = "" And Range("F" & n) = "" And Range("G" & n) = "" Then Rows(n).Delete
Next n
Application.ScreenUpdating = True
Ca fonctionne bien mais vous en conviendrez, c'est très moche !
C'est une idée, mais peut-être est-il possible (ou pas) de réutiliser ce code trouvé ICI :
Code:
With ActiveSheet.UsedRange
DerLi = .Row + .Rows.Count - 1
End With
For r = DerLi To 1 Step -1
If Application.CountA(Rows(r)) = 0 Then Rows(r).Delete
Next r
Il supprime toutes les lignes vides sans tenir compte de la colonne A qui dans mon cas ne sera jamais vide (c'est tout ce qui est après cette colonne que je veux tester).
J'espère avoir été suffisamment clair... Merci d'avance pour votre aide !
Quand tu effaces une ligne , cela efface forcément la colonne A
puisqu'une ligne dans Excel va de la colonne A à la colonne IV (pour les versions d'Excel jusq'à Excel 2003)
Tu ne peux pas supprimer quelques cellules d'une ligne, mais toujours toute la ligne.
oui je sais bien, et j'aimerais justement trouver un moyen pour contourner ça, écrit de telle façon qu'il teste toutes les colonnes sauf la colonne A avant de supprimer. C'est possible (d'une autre manière que celle que j'ai trouvée) ?
Oui je sais... dans ce cas est-ce que je peux remplacer
Code:
Range("B" & n) = "" And Range("C" & n) = "" And Range("D" & n) = "" And Range("E" & n) = "" And Range("F" & n) = "" And Range("G" & n) = ""
Par quelque chose de + court et qui prend en compte toutes les colonnes de B à la dernière colonne ? Quitte à rajouter une boucle For qui ferait un truc du genre Range(m & n) avec m qui va de B à la dernière?
j'avais aussi pensé à utiliser Cells(i,j) en testant une par une les cellules mais c'est bof
Regardes cette macro de test (à tester sur un nouveau classeur vide)
Code:
Sub test()
Dim c As Range, Donnees As Range
Range("A1:A10") = Rnd
For Each c In Range("B1:G10")
c = IIf(c.Row Mod 2 = 1, Rnd, vbNullString)
Next c
Set Donnees = ActiveSheet.UsedRange
pause = MsgBox("Cellules vides: " & Donnees.SpecialCells(xlCellTypeBlanks).Address)
Donnees.EntireRow.Delete
End Sub
Tu vois bien que des données en colonne A sont supprimées.
@Pierrot93 : Merci le problème venait de chez moi ça fonctionne très bien !
Le code est bien pensé, je comprends le truc mais j'aurais jamais trouvé je pense...
Quelque chose m'échappe
Pour moi des données en colonne sont bel et bien supprimées
Pour t'en convaincre , lance cette macro
Code:
Sub Macropourtest()
Dim c As Range, Donnees As Range
Range("A1:A5") = Application.Transpose(Array(1, "NE PAS EFFACER", 1, "NE PAS EFFACER", 1))
For Each c In Range("B1:G5")
c = IIf(c.Row Mod 2 = 1, Rnd, vbNullString)
Next c
End Sub
Ensuite lance ta 1ère macro
Code:
Sub TaMacro()
Application.ScreenUpdating = False
For n = ActiveSheet.UsedRange.Rows.Count To 1 Step -1
If Range("B" & n) = "" And Range("C" & n) = "" And Range("D" & n) = "" And Range("E" & n) = "" And Range("F" & n) = "" And Range("G" & n) = "" Then Rows(n).Delete
Next n
Application.ScreenUpdating = True
End Sub
Les cellues qui contenaient NE PAS EFFACER ont bien été supprimées quand on efface les lignes vides, non ????
PS: Le code de Pierrot93 efface également avec les cellules contenant "NE PAS EFFACER"
Oui je viens de tester. Pour moi ce ne sont pas des données en colonne qui sont supprimées mais des données en ligne !
Je ne vois pas le problème
PS: Le code de Pierrot est à rajouter au début de l'autre, le code complet est:
Code:
Application.ScreenUpdating = False
With ActiveSheet.UsedRange
DerLi = .Row + .Rows.Count - 1
End With
For r = DerLi To 1 Step -1
If Application.CountA(Cells(r, 2).Resize(, Columns.Count - 1)) = 0 Then Rows(r).Delete
Next r
Application.ScreenUpdating = True
Dans ton premier message, tu dis que ta colonne A n'est jamais vide
Ce qui laisse supposer que les données en colonne A ne doivent pas être effacé.
Or elles le sont (quelque soit le code VBA employé)
Donc j'en déduis que ce n'est pas grave pour toi , si tes données présentes en colonne A sur une ligne
qui commence en colonne A et qui finit en colonne G (avec les colonnes B:G vides) sont effacés.