Autres Macro qui supprime des lignes si une cellule vide

Debutantexcel8

XLDnaute Nouveau
Bonjour,

Je suis débutant en excel vba et je souhaiterais savoir si vous pouvez m'aider svp pour le sujet suivant :

J'ai un fichier excel qui a énormément de lignes plus de 400 000 lignes (il s'agit d'un fichier brut que je veux dégrossir et ne garder qu'une sélection de lignes spécifiques avec des mots précis). Les lignes dont je n'ai pas besoin représentent environ 200 000 lignes.

Dans la colonne AN (exemple ci-joint), je cherche une macro qui irait chercher les mots Taxi ou Balai sur toute la colonne AN (énormément de lignes), si elle ne trouve pas ces mots ou si elle trouve que la cellule est vide, alors elle supprime toutes les lignes qui n'ont pas ces mots; merci
 

Pièces jointes

  • classeur1 (1).xlsx
    7.5 KB · Affichages: 6

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @Debutantexcel8 :),

cliquer sur le bouton Init 400 000 initialise 400 000 lignes en colonne AN.

cliquer sur le bouton Conserver taxi et balai ne conserve que les lignes contenant les mots "Taxi" ou "Balai" (les lignes contenant taxidermiste sont éliminées - si vous ne le désirez pas, m'en informer).

Pour 400 000 lignes sources avec près de 50 % de lignes contenant "taxi ou "balai", la durée est d'environ 5,2 sec.

La feuille "Data" n'est là que pour l'initialisation pour l'exemple.

Le code est dans le module de la feuille "Données brutes" :
VB:
Sub ConserverLignes()
Dim xrg As Range, t, i&, s, dercol&, debut

   debut = Timer
   Set xrg = Intersect(Columns("an:an"), Me.UsedRange, Rows(2).Resize(Rows.Count - 1))
   t = xrg
   For i = 1 To UBound(t)
      s = ";" & LCase(Replace(t(i, 1), " ", "")) & ";"
      If s Like "*;balai;*" Then
         t(i, 1) = i
      ElseIf s Like "*;taxi;*" Then
         t(i, 1) = i
      Else
         t(i, 1) = Empty
      End If
   Next i
   dercol = Me.UsedRange.Column + Me.UsedRange.Columns.Count
   Application.ScreenUpdating = False
   Cells(xrg.Row, dercol).Resize(UBound(t)) = t
   With Rows(xrg.Row).Resize(UBound(t), dercol)
      .Sort Key1:=.Cells(1, dercol), order1:=xlAscending, Header:=xlNo
      On Error Resume Next
      .Columns(dercol).SpecialCells(xlCellTypeBlanks).Select
      .Columns(dercol).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
      .Columns(dercol).Delete
   End With
   MsgBox Format(UBound(t), "#,##0") & " lignes traitées en " & Format(Timer - debut, "0.00\ sec,") & _
      vbLf & vbLf & "il reste " & Format(Application.CountA(Columns("an:an")) - 1, "#,##0\ lignes."), vbInformation
End Sub
 

Pièces jointes

  • Debutantexcel8- suppr lignes- v1.xlsm
    21.9 KB · Affichages: 6
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour Debutantexcel8, mapomme,

Voyez le fichier joint et cette macro dans le code de la feuille "Résultat" :
VB:
Private Sub Worksheet_Activate()
With Sheets("Données brutes").UsedRange.EntireRow
    .AutoFilter
    .AutoFilter 40, "*Balai*", xlOr, "*Taxi*"
    .Copy [A1] 'copier-coller
    .AutoFilter 'ôte le filtre
End With
End Sub
Elle se déclenche automatiquement quand on active la feuille.

A+
 

Pièces jointes

  • classeur(1).xlsm
    17.1 KB · Affichages: 6

job75

XLDnaute Barbatruc
Bonsoir Debutantexcel8, mapomme, le forum,

Une solution très voisine de celle de mapomme :
VB:
Sub Filtrer()
Dim dercel As Range
Set dercel = Cells.SpecialCells(xlCellTypeLastCell)
Application.ScreenUpdating = False
With Range(Cells(2, dercel.Column + 1), dercel(1, 2))
    If .Row = 1 Then Exit Sub
    .Formula = "=SIGN(IFERROR(SEARCH(""Taxi"",AN2),SEARCH(""Balai"",AN2)))"
    .Value = .Value 'supprime les formules
    .EntireRow.Sort .Cells, xlAscending, Header:=xlNo 'tri pour regrouper et accélérer
    On Error Resume Next
    .SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete 'supprime les valeurs d'erreur
    .ClearContents 'RAZ
End With
End Sub
Testée comme celle de mapomme sur 400 000 lignes : les 2 macros s'exécutent chez moi en 5,4 secondes.

A+
 

Pièces jointes

  • classeur(2).xlsm
    17 KB · Affichages: 6

Debutantexcel8

XLDnaute Nouveau
Bonjour,
Merci beaucoup, beaucoup, la macro ci-dessous fonctionne mais je voudrais savoir si c'est possible de prévoir que la macro ne soit pas limitée à un nombre de lignes ou si ce n'est pas possible mettre une limite plus importante (mon fichier actuel compte 436 000 lignes mais le nombre de lignes évoluera)

Sub Filtrer()
Dim dercel As Range
Set dercel = Cells.SpecialCells(xlCellTypeLastCell)
Application.ScreenUpdating = False
With Range(Cells(2, dercel.Column + 1), dercel(1, 2))
If .Row = 1 Then Exit Sub
.Formula = "=SIGN(IFERROR(SEARCH(""Taxi"",AN2),SEARCH(""Balai"",AN2)))"
.Value = .Value 'supprime les formules
.EntireRow.Sort .Cells, xlAscending, Header:=xlNo 'tri pour regrouper et accélérer
On Error Resume Next
.SpecialCells(xlCellTypeConstants, 16).EntireRow.Delete 'supprime les valeurs d'erreur
.ClearContents 'RAZ
End With
End Sub
 

Discussions similaires

Réponses
5
Affichages
383

Membres actuellement en ligne

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16