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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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." <lsoudronZZZ@business-services.fr> a écrit dans le message de
news: mn.12437d52397482fb.27055@business-services.fr...
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
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
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
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
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
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
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
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