Suppression rapide de lignes en VBA

Risbal14

XLDnaute Nouveau
Bonjour à tous,

Débutant depuis aujourd'hui en VBA, je cherche la solution la plus rapide pour supprimer automatiquement des lignes dans le fichier joint (si cellule i de la colonne H est vide alors suppression de la ligne).

J'ai vu sur le forum différentes alternatives (MATCH, filtre, etc...), mais j'ai des difficultés à m'y retrouver.

J'utilise actuellement la solution par filtre, mais je ne suis pas sûr que ce soit la meilleure et la plus rapide pour un nombre de lignes important.

Avez-vous une idée pour accélèrer le traitement qui peut être parfois de plus de 300 000 lignes?

D'avance merci pour votre contribution.

Boris.
 

Pièces jointes

  • Macro synthèse globale.xlsm
    640.1 KB · Affichages: 150

tbft

XLDnaute Accro
Re : Suppression rapide de lignes en VBA

Bonjour

Sans avoir ouvert ton fichier, je pense que le rapide est d'éviter de travail sur le fichier.
Le mieu (a mon avis de débutant) est de charger le contenue du fichier dans une variable.
Puis de traiter cette variable
Et enfin de ré écrire le contenue de la varible dans le fichier.

Cela ce fait bien mais ca devient compliquer quand le fichier à une mise en forme particulière.
Mais cela a déjà fait ces preuves....
 

youky(BJ)

XLDnaute Barbatruc
Re : Suppression rapide de lignes en VBA

Bonjour,
Voici une solution, assez simple et rapide
Et une seule ligne suffit, le 4 signifie vide

[H:H].SpecialCells(4).Delete

Bruno

Complément
ou pour s'arreter en dernière ligne de col A
range("H2:H" & range("A" & rows.count).End(3).Row).SpecialCells(4).delete
 
Dernière édition:

jim7963

XLDnaute Junior
Re : Suppression rapide de lignes en VBA

Bonjour Risbal,

perso voici la ce que je mettrai dans ta macro en remplacement de la partie qui concerne la suppression des lignes.

Code:
Application.ScreenUpdating = False        'bloque la mise à jour de l'écran

Dim a As Long, b As Long                      'définition des variables
    
    a = Range("A2").End(xlDown).Row       ' recherche de la dernière ligne du tableau à partir de la colonne A
     
For b = a To 2 Step -1
    If Cells(b, 8).Value = "" Then              'recherche de toutes les cellules vides dans la colonne H de la dernière ligne jusqu'à la ligne 2
    
        Rows(b).Delete Shift:=xlUp             ' suppression des lignes où la cellule est vide
    
    End If
Next b
     
Application.ScreenUpdating = True
 
Dernière édition:

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Suppression rapide de lignes en VBA

Bonjour à tous,

(si cellule i de la colonne H est vide alors suppression de la ligne).
un peu flou cette question
j’interprèterais cela comme:
si la cellule de la colonne H est vide
dans ce cas, le code ci-dessous fera le travail
Code:
Sub Suppression()
Application.ScreenUpdating = False
For i = Range("A65535").End(xlUp).Row To 2 Step -1
If Cells(i, 8) = "" Then Rows(i).EntireRow.Delete
Next i
Application.ScreenUpdating = True
End Sub

à+
Philippe
 

jim7963

XLDnaute Junior
Re : Suppression rapide de lignes en VBA

Salut Youki,

le temps de faire ma réponse tu avais déjà répondu. Il me semble qu'avec ta solution, seules les cellules de la colonne H vont être supprimées or d'après ce que j'ai compris, Risbal veut supprimer la ligne entière.
 

Risbal14

XLDnaute Nouveau
Re : Suppression rapide de lignes en VBA

Merci beaucoup à tous pour votre aide.

Les macros fonctionnent par contre le temps de traitement est assez long.

Méthode par filtre : quelques secondes pour 7000 L.
Méthode avec screen updating : près de 10 minutes pour 7000L.

Sachant que j'ai certains fichiers qui risquent de faire près de 200 000L

J'ai cru voir sur d'autres posts qu'il existait des méthodes plus rapides en terme de traitement (match, tri, etc.), mais j'avoue que c'est très ambigu vu mon niveau EXCEL et VBA :)

Quelqu'un aurai t-il une idée pour raccourcir ce temps de traitement?

Boris.
 

néné06

XLDnaute Accro
Re : Suppression rapide de lignes en VBA

Bonsoir Le Forum, bonsoirRisbal14

Si tu souhaites supprimer les lignes dont les cellules de la colonne (H) sont vides et que l'ordre d'affichage n'est pas un critère,tu fais un tri de la colonne H et tu supprimes les ligne vides.

Même pour plus de 300000 lignes , cela est pratiquement instantané.

Méthode avec screen updating n'est pas une méthode de suppression ou de tri, mais évite l'affichage de la feuille et le scintillement.

A+

René
 

Si...

XLDnaute Barbatruc
Re : Suppression rapide de lignes en VBA

salut

le bout de code correspondant (Si... le tri ne te gêne pas) pourrait être
Code:
  ' Suppression des lignes  pour les cellules vides de la colonne H
  dl = Cells(Rows.Count, 8).End(xlUp).Row
  Range("A:O").Sort [H1], xlDescending
  dli = Cells(Rows.Count, 8).End(xlUp).Row + 1
  Rows(dl & ":" & dli).Delete
 

néné06

XLDnaute Accro
Re : Suppression rapide de lignes en VBA

Re,

Essayes cet exemple et dis-nous ?

fin = Range("A65536").End(xlUp).Row' fin du tableau
Range(Cells(1, 1), Cells(fin, 16)).Select'selection du debut à la fin
Selection.Sort Key1:=Range("H1"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom ' tri
finecrit = Range("H65536").End(xlUp).Row 'recherche derniere ligne ecrite en colonne H
Range(Rows(finecrit + 1), Rows(fin)).Delete shift:=xlShiftUp ' Supprime les lignes de finecrit à fin

A+

René
 

Pièces jointes

  • Copie de Macro synthèse globale-3.xlsm
    645.4 KB · Affichages: 143

Risbal14

XLDnaute Nouveau
Re : Suppression rapide de lignes en VBA

Salut,

Un grand merci à vous tous pour votre aide.

Effectivement c'est beaucoup plus rapide.

La formule de René ne traite que les 65536 premières lignes alors que je peux avoir parfois plus de 200 000 L.

J'ai essayé de modifier le code de René (ci-dessous) pour augmenté le nombre de lignes traitées et pour conserver les entêtes de colonnes mais il y a une erreur dans le traitement (Ligne 2 non supprimée alors que H2 est vide).

' Suppression des lignes pour les cellules vides de la colonne H
fin = Cells(Rows.Count, 7).End(xlUp).Row ' fin du tableau
Range(Cells(2, 1), Cells(fin, 16)).Select 'selection du debut à la fin
Selection.Sort Key1:=Range("H1"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom ' tri
finecrit = Cells(Rows.Count, 8).End(xlUp).Row 'recherche derniere ligne ecrite en colonne H
Range(Rows(finecrit + 1), Rows(fin)).Delete shift:=xlShiftUp ' Supprime les lignes de finecrit à fin

J'ai modifié également la fin du tableau en me basant sur la colonne G plutôt que H (pour éviter une erreur si la dernière cellule de H est vide).

2 questions complémentaires :

- Est-il possible de conserver les entêtes de colonnes avec le code de René ou celui de SI...

- Est-il possible d'appliquer un tri inverse suite à la suppression des lignes (colonne E : du plus ancien au plus récent puis colonne B du plus petit au plus grand puis colonne G de A à Z) afin de retrouver une mise en forme similaire au données initiales?

Merci à vous et bonne journée.

Boris.
 

jim7963

XLDnaute Junior
Re : Suppression rapide de lignes en VBA

Je suis étonné que le traitement soit si lent avec la macro que je t'ai donné. Je l'ai testé sur mon PC qui moulinait sur un autre programme en même temps et pourtant sur le fichier de 7000 lignes la macro n'a mis que quelques secondes pour tout réaliser (et je n'ai pas un PC particulièrement puissant).
 

Efgé

XLDnaute Barbatruc
Re : Suppression rapide de lignes en VBA

Bonjour à tous,
Une proposition sans filtre mais qui reste rapide (0,65 seconde pour les 7 500 lignes de l'exemple) et qui laisse les dpnnées dans l'ordre d'origine.
VB:
Sub Test()
Dim I&, J&, K&, T As Variant
K = 1
With Sheets("Données brutes")
    T = .Range("A1:O" & .Cells(Rows.Count, 1).End(xlUp).Row)
        
    For I = 2 To UBound(T, 1)
        If T(I, 8) < > "" Then
                K = K + 1
                For J = 1 To UBound(T, 2)
                    T(K, J) = T(I, J)
                Next J
        End If
    Next I
    
    Application.ScreenUpdating = False
    .Columns(1).Resize(, UBound(T, 2)).ClearContents
    .Range("A1").Resize(K, UBound(T, 2)) = T
    Application.ScreenUpdating = True
End With
End Sub
Cordialement
 
Dernière édition:

Risbal14

XLDnaute Nouveau
Re : Suppression rapide de lignes en VBA

Bonjour à tous,

Efgé, ta macro réagit bizarrement.

Elle modifie la feuille Données brutes en supprimant toutes les lignes pour lesquels les cellules contiennent des données (à l'inverse de ce qui est souhaité :))

Elle recopie en Données traitées la feuille d'origine.

Etant novice, j'avoue ne pas bien voir d'ou vient l'erreur.

Boris.
 

Discussions similaires

Réponses
12
Affichages
304

Statistiques des forums

Discussions
312 198
Messages
2 086 149
Membres
103 132
dernier inscrit
hedfahmi