Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Suppression de lignes selon critère (BIS)

2 réponses
Avatar
Laurent S.
J'ai un gros problème que je n'arrive pas à résoudre.

J'ai dans un classeur un onglet "Data" qui contient plus de 47500
lignes.
Un autre onglet contient une plage de codes Agence qui sont utilisés.
Il me faut donc supprimer toutes les lignes de l'onglet "Data" dont le
code agence n'est pas dans ceux attendus.

Grace à anomymousA, j'ai une fonction (ci-dessous) qui utilise la
fonction VLookup MAIS qui est beaucoup trop lente (même sur une machine
puissante). AV (Alain Vallon) indiquait dans un post suivant qu'avec un
filtre, le traitement devrait aller beaucoup plus vite.
Mon problème est que je ne sais pas comment faire cette opération avec
un filtre !!!
Pouvez-vous m'aider s.v.p.

Voici un lien vers un fichier de test avec moins de lignes :
http://cjoint.com/?cbmzFQGDHg

Merci pour votre aide


Code fourni par anomymousA:
Sub SuppressionAgencesInutiles()
Application.ScreenUpdating = False
Application.EnableEvents = False
Sheets("Menu").Activate
Set rngA = ActiveSheet.Range("B7:B42")
Sheets("Data").Activate
derligne = Range("B65536").End(xlUp).Row
For I = derligne To 1 Step -1
On Error Resume Next
tampon = Application.WorksheetFunction.VLookup(Cells(I, 1), rngA, 1,
False)
If Err.Number <> 0 Then
Err.Clear
'Cells(I, 1).EntireRow.Delete
Rows(I).Delete Shift:=xlUp
End If
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

2 réponses

Avatar
Corona
Bonjour Laurent,
Si c'est la fonction VLookup qui ralenti le process, tu peux au
préalable trier la feuille "Data" par Agence, et ensuite lors de la lecture
des lignes sauvegarder dans une variable le dernier n° lu et appliquer le
même process que le précédent (delete ou non) .
Ainsi tu n'utiliseras la fonction VLookup que lorsque le dernier n° lu
sera différent de celui que tu lis.
Philippe

"Laurent S." a écrit dans le message de
news:
J'ai un gros problème que je n'arrive pas à résoudre.

J'ai dans un classeur un onglet "Data" qui contient plus de 47500 lignes.
Un autre onglet contient une plage de codes Agence qui sont utilisés.
Il me faut donc supprimer toutes les lignes de l'onglet "Data" dont le
code agence n'est pas dans ceux attendus.

Grace à anomymousA, j'ai une fonction (ci-dessous) qui utilise la fonction
VLookup MAIS qui est beaucoup trop lente (même sur une machine puissante).
AV (Alain Vallon) indiquait dans un post suivant qu'avec un filtre, le
traitement devrait aller beaucoup plus vite.
Mon problème est que je ne sais pas comment faire cette opération avec un
filtre !!!
Pouvez-vous m'aider s.v.p.

Voici un lien vers un fichier de test avec moins de lignes :
http://cjoint.com/?cbmzFQGDHg

Merci pour votre aide


Code fourni par anomymousA:
Sub SuppressionAgencesInutiles()
Application.ScreenUpdating = False
Application.EnableEvents = False
Sheets("Menu").Activate
Set rngA = ActiveSheet.Range("B7:B42")
Sheets("Data").Activate
derligne = Range("B65536").End(xlUp).Row
For I = derligne To 1 Step -1
On Error Resume Next
tampon = Application.WorksheetFunction.VLookup(Cells(I, 1), rngA, 1,
False)
If Err.Number <> 0 Then
Err.Clear
'Cells(I, 1).EntireRow.Delete
Rows(I).Delete Shift:=xlUp
End If
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub




Avatar
anomymousA
bonjour,

un nouvel exemple se servant non plus de Vlookup mais de Match(EQUIV:
rendons grace à AV sur la rapidité meilleure de EQUIV).
Par ailleurs, cette procédure utilise un filtre. Ici , il crée un champ en
colonne 13 ( c'est pour les besoins de mon exemple que j'ai testé avec 58900
lignes sur une échantillon de comparaison de 4 cellules ) temporaire
permettant ensuite de faire un filtre pour discriminer les données à garder
puis il supprime le filtre et le champ temporaire.
J'ai mis en commentaire le Application.enableevents car je n'en ai pas
l'utilité. Je ne sais pas si toi tu dois t'en servir mais je ne pense l'avoir
inscrit dans mon 1er envoi.
Mon exemple tourne en 18s avec une machine moyenne.

Sub essaitri()

With Application
.ScreenUpdating = False
.DisplayAlerts = False
End With

'Application.EnableEvents = False
Sheets("Feuil1").Activate
Set rngA = ActiveSheet.Range("A1:A4")
Sheets("DONNEES").Activate
derligne = Range("B65536").End(xlUp).Row
For I = derligne To 2 Step -1
On Error Resume Next
tampon = Application.WorksheetFunction.Match(Cells(I, 3).Value, rngA, 0)
If Err.Number <> 0 Then
Err.Clear
Cells(I, 13).Value = 1
End If
Next
'Application.EnableEvents = True

Cells(1, 13).Value = "tri"
Cells(1, 13).AutoFilter

Set plagefiltre = ActiveSheet.AutoFilter.Range
plagefiltre.AutoFilter Field:, Criteria1:="1"
With plagefiltre
Set plagefiltrevisible = .Offset(1, 0).Resize(.Rows.Count - 1,
.Columns.Count).SpecialCells(xlCellTypeVisible)
End With
plagefiltrevisible.Delete
Cells(1, 13).AutoFilter
Cells(1, 13).clearcontents

With Application
.ScreenUpdating = True
.DisplayAlerts = True
End With

End Sub

A+


J'ai un gros problème que je n'arrive pas à résoudre.

J'ai dans un classeur un onglet "Data" qui contient plus de 47500
lignes.
Un autre onglet contient une plage de codes Agence qui sont utilisés.
Il me faut donc supprimer toutes les lignes de l'onglet "Data" dont le
code agence n'est pas dans ceux attendus.

Grace à anomymousA, j'ai une fonction (ci-dessous) qui utilise la
fonction VLookup MAIS qui est beaucoup trop lente (même sur une machine
puissante). AV (Alain Vallon) indiquait dans un post suivant qu'avec un
filtre, le traitement devrait aller beaucoup plus vite.
Mon problème est que je ne sais pas comment faire cette opération avec
un filtre !!!
Pouvez-vous m'aider s.v.p.

Voici un lien vers un fichier de test avec moins de lignes :
http://cjoint.com/?cbmzFQGDHg

Merci pour votre aide


Code fourni par anomymousA:
Sub SuppressionAgencesInutiles()
Application.ScreenUpdating = False
Application.EnableEvents = False
Sheets("Menu").Activate
Set rngA = ActiveSheet.Range("B7:B42")
Sheets("Data").Activate
derligne = Range("B65536").End(xlUp).Row
For I = derligne To 1 Step -1
On Error Resume Next
tampon = Application.WorksheetFunction.VLookup(Cells(I, 1), rngA, 1,
False)
If Err.Number <> 0 Then
Err.Clear
'Cells(I, 1).EntireRow.Delete
Rows(I).Delete Shift:=xlUp
End If
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub