[Résolu] Raccourcir mon code VBA moche

djodjodjo

XLDnaute Occasionnel
Bonjour à tout le forum,

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 !
 
Dernière édition:

TempusFugit

XLDnaute Impliqué
Re : Raccourcir mon code VBA moche

Bonjour


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.
 

djodjodjo

XLDnaute Occasionnel
Re : Raccourcir mon code VBA moche

Bonjour,

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) ?
 

djodjodjo

XLDnaute Occasionnel
Re : Raccourcir mon code VBA moche

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
 

Pierrot93

XLDnaute Barbatruc
Re : Raccourcir mon code VBA moche

Bonjour,

regarde peut être ceci si ca correspond à ton besoin... A voir ....
Code:
For r = derli To 1 Step -1
    If Application.CountA(Cells(r, 2).Resize(, Columns.Count - 1)) = 0 Then Rows(r).Delete
Next r

Bon après midi
@+
 

TempusFugit

XLDnaute Impliqué
Re : Raccourcir mon code VBA moche

Bonjour de nouveau


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.
 

djodjodjo

XLDnaute Occasionnel
Re : Raccourcir mon code VBA moche

@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...

Merci à vous deux de m'avoir répondu !
 
Dernière édition:

TempusFugit

XLDnaute Impliqué
Re : Raccourcir mon code VBA moche

Bonjour de nouveau

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"
 
Dernière édition:

djodjodjo

XLDnaute Occasionnel
Re : Raccourcir mon code VBA moche

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

Ca marche pour moi en tout cas
 
Dernière édition:

TempusFugit

XLDnaute Impliqué
Re : Raccourcir mon code VBA moche

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.
 

Discussions similaires

Réponses
5
Affichages
244

Statistiques des forums

Discussions
312 500
Messages
2 089 010
Membres
104 004
dernier inscrit
mista