supprimer lignes vides d'une plage sans supprimer les lignes de la feuille

MaLoNeurons

XLDnaute Nouveau
Bonjour,
J'ai pas mal cherché, en vain, sur les forums excel, une macro permettant de supprimer les lignes vides d'une plage dans un tableau sans supprimer les lignes de la feuille pour ne pas supprimer les données des tableaux adjacents Désolé je n'ai pas pu faire moins obscur comme explication. Je me suis donc lancé avec mes humbles connaissances dans l'écriture d'un code qui fonctionne, mais je suis sûr qu'il y a moyen de l'alléger et de l'accélerer. Voici le code en question :
Sub SuppLigneVides()
Dim Plage As Range
Application.ScreenUpdating = False
'determination de la taille de la plage

With ActiveSheet.Range("M3:p19")
derLI = .Row + .Rows.Count - 1
End With
'boucle de test de la plage
For i = 3 To derLI
xtest = 0
X = i
NBVIDE = 0
'test si premiere ligne VIDE
Set Plage = Range("M" & X & ":p" & X)
NBVIDE = WorksheetFunction.CountBlank(Plage)
If NBVIDE = 4 Then X = X + 1
' boucle interne pour vérifier si les lignes suivantes sont vides
Do While X <> i And NBVIDE = 4
xtest = 1
' Si les 4 cellules en colonne MNOP de la ligne X sont vides
' alors la plage est vide
Set Plage = Range("M" & X & ":p" & X)
NBVIDE = WorksheetFunction.CountBlank(Plage)
If NBVIDE = 4 Then X = X + 1
' arrêter le test s'il arrive en bout de plage
If X > derLI Then
X = derLI
Exit Do
End If
Loop
' si ligne i vide --> valeurs de cellules = valeurs de cellule de
' la prochaine ligne X non vide
If xtest = 1 Then
Sheets("Feuil2").Range("M" & i & ":p" & i).Value = Sheets("Feuil2").Range("M" & X & ":p" & X).Value
' effacement de la ligne X une fois recopiée en i
Set Plage = Range("M" & X & ":p" & X)
Plage.ClearContents
xtest = 0
End If
Next i
Application.ScreenUpdating = True
End Sub
'Merci !!!
 

Dranreb

XLDnaute Barbatruc
Re : supprimer lignes vides d'une plage sans supprimer les lignes de la feuille

Bonsoir.
À moins qu'il n'y ait également des choses à préserver sous la plage et non seulement dans d'autres colonnes,
Ceci marche aussi bien:
VB:
Dim L As Long
With ActiveSheet.Range("M3:P19")
   For L = .Rows.Count To 1 Step -1
      If WorksheetFunction.CountA(.Rows(L)) = 0 Then .Rows(L).Delete xlShiftUp
      Next L
   End With
End Sub
À+
 

MaLoNeurons

XLDnaute Nouveau
Re : supprimer lignes vides d'une plage sans supprimer les lignes de la feuille

Bonjour à tous,
Merci pour vos conseils éclairés !
La première proposition me semble plus adaptée, car la seconde fait effectivement remonter les données du tableau situé en dessous, mais c'est toujours bon à savoir.La première a cependant un écueil que je n'ai pas réussi à contourner, par rapport à la mienne : elle déplace aussi la mise en forme des cellules...La solution serait d'utiliser l'option "mettre sous forme de tableau", mais pour ma culture personnelle, si vous connaissez le moyen de contourner la difficulté (cut destination avec copie de valeurs sans les formats)...
En tout cas, vos deux macros tiennent en 6 lignes max, voilà qui accélère le calcul.A ce propos je me suis aperçu que ma première macro était considérablement ralentie par les mises en formes conditionnelles. Y a-t-il moyen de les désactiver le temps de la procédure ?(peut être dois-je ouvrir une nouvelle discussion à ce sujet?). Pour ceux que ça intéresse, voilà le code de phlaurent(merci à lui!) adapté à mon problème(supprimer les plages vides d'un tableau sans supprimer les lignes de cellule).
 

Pièces jointes

  • SupLlignesVides.xlsm
    31.1 KB · Affichages: 228

Dranreb

XLDnaute Barbatruc
Re : supprimer lignes vides d'une plage sans supprimer les lignes de la feuille

Bonjour.
Alors:
VB:
Dim L As Long
With ActiveSheet.Range("M3:P19")
   For L = .Rows.Count To 1 Step -1
      If WorksheetFunction.CountA(.Rows(L)) = 0 Then
'         .Rows(L).ClearContents
         .Rows(L).Cut
         .Rows(.Rows.Count + 1).Insert xlShiftDown
         End If
      Next L
   End With
End Sub
(Non testé)

Ah, ça ne va pas du tout. Je le retravaille.
Mais c'est simple. Corrigé
Peut être vaudrait il mieux affecter .Rows.Count à une variable pour ne pas le rechercher 36 fois
Et le .Rows(L).ClearContents n'est pas utile, suis je bête, elle est déjà vide.

À+
 
Dernière édition:

MaLoNeurons

XLDnaute Nouveau
Re : supprimer lignes vides d'une plage sans supprimer les lignes de la feuille

(Re)Bonjour
Cette procédure décale aussi les mises en forme...Quant à la variable, c'est grosso modo ce que j'avais fait dans la procédure de mon premier message avec la variable 'xtest' (xtest=0-->si la plage est vide alors xtest=1 et on cherche la prochaine plage non vide). Mais merci quand même !
 

JNP

XLDnaute Barbatruc
Re : supprimer lignes vides d'une plage sans supprimer les lignes de la feuille

Bonjour le fil :),
Quitte a utiliser des tableaux, autant les gérer comme des tableaux :rolleyes:...
Code:
Sub Test()
Dim I As Integer
For I = Range("tableau5").Rows.Count To 1 Step -1
If WorksheetFunction.CountBlank(Range("tableau5").ListObject.ListRows(I).Range) = Range("tableau5").Columns.Count Then
Range("tableau5").ListObject.ListRows(I).Delete
End If
Next I
End Sub
Parce qu'autrement, ton tableau garde la même dimension avec des lignes vides en bas ;)...
Tu remarqueras en plus qu'étant donné que je n'ai comme référence que "tableau5", tu pourrais très bien le passer en argument à la Sub pour traiter plusieurs tableau avec une seule Sub :p...
Bonne suite :cool:
 

JNP

XLDnaute Barbatruc
Re : supprimer lignes vides d'une plage sans supprimer les lignes de la feuille

Re :),
Tant qu'à faire, le code optimisé pour la vitesse et qui traitera tous les tableaux de la feuille :p
Code:
Sub Test2()
Dim I As Integer, Largeur As Byte
Dim MonTableau As ListObject
With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    For Each MonTableau In ActiveSheet.ListObjects
        Largeur = MonTableau.Range.Columns.Count
        For I = MonTableau.Range.Rows.Count - 1 To 1 Step -1
            If WorksheetFunction.CountBlank(MonTableau.Range.ListObject.ListRows(I).Range) = Largeur Then
                MonTableau.ListRows(I).Delete
            End If
        Next I
    Next MonTableau
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
End With
End Sub
 

MaLoNeurons

XLDnaute Nouveau
Re : supprimer lignes vides d'une plage sans supprimer les lignes de la feuille

Bonjour JNP,
Encore une proposition instructive, mais je souhaite garder les tableaux tels quels pour ne pas destabiliser l'agencement et l'affichage de mes feuilles.De plus, il change aussi les paramètres de mise en forme conditionnelle ajoutées au tableau.
Merci quand même pour le temps consacré à ma requête, car ton code utilise des instructions que je ne connaissais pas.Pour ne pas changer la taille des tableaux, je crois qu'il faut traiter le contenu de leurs cellules plutôt que leurs cellules elles-mêmes.Par contre,le 'xlCalculationManual' auquel je n'avais pas pensé, répond à un de mes problèmes: il permet de stopper temporairement les mises en formes conditionnelles qui ralentissaient ma procédure.
Merci donc !
 

JNP

XLDnaute Barbatruc
Re : supprimer lignes vides d'une plage sans supprimer les lignes de la feuille

Re :),
Pour ne pas changer la taille des tableaux, je crois qu'il faut traiter le contenu de leurs cellules plutôt que leurs cellules elles-mêmes.
C'est aller à l'encontre de tout ce que les tableaux 2007 ont apporté :rolleyes:... Le principe est justement que tu peux mettre plusieurs tableaux les uns en dessous des autres, et que l'ajout ou la suppression de ligne se compense automatiquement, en conservant toujours toutes les zones nommées (qui se déclinent avec les crochets, par exemple tableau5[Nom] fait référence à la colonne Nom sans l'entête :p) ;). Il autoremplit les formules au fur et à mesure de l'ajout de ligne, et conserve la mise en forme d'un tableau. Et pour les MFC, elles s'adaptent en fonction de la hauteur du tableau :).
Mais bon, c'est toi qui voit :rolleyes:...
Bon courage :cool:
 

MaLoNeurons

XLDnaute Nouveau
Re : supprimer lignes vides d'une plage sans supprimer les lignes de la feuille

Hello again,
je ne vais pas rentrer dans le détail, mais pour des raisons pratiques ,l'affichage et la présentation des feuilles en question est figé,c'est pourquoi les tableaux doivent conserver leur taille.Merci tout de même pour ta contribution.
 

Discussions similaires

Réponses
6
Affichages
140
Réponses
2
Affichages
153

Statistiques des forums

Discussions
312 239
Messages
2 086 495
Membres
103 236
dernier inscrit
Menni