Supression de lignes prend beaucoup de temps

Bonjour à tous,

J'ai un petit code qui me permet de faire une comparaison entre 2 fichiers.

S'il y a une concordance entre ces 2 fichiers, alors garder ces lignes et supprimer les autres.

Mon fichier 1 contient 32 000 lignes et mon fichier 2 en contient 190.

Si la cellule C1 du fichier 2 correspond pas à la cellule D1 du fichier 1, alors supprimer la ligne du fichier 1

etc...

Mon code a l'air de bien marcher, le problème c'est qu'il prend beaucoup beaucoup de temps.

Quelqu'un aurait il une astuce pour réduire le temps que cela prend?

voici mon code

Merci

ption Explicit
Sub CListesDo()
Dim Class1 As Workbook
Dim Class2 As Workbook
Dim PlageClass2 As Range
Dim CellClass2 As Range
Dim PlageClass1 As Range
Dim CellClass1 As Range
Dim LastLineC1 As Long
Dim LastLineC2 As Long
  '
Set Class2 = Workbooks.Open("C:\Documents and Settings\fichier2.xls", ReadOnly:=True)
Set Class1 = Workbooks.Open("C:\Documents and Settings\fichier1..xls")
  'Supprimer les colonnes inutiles
Columns("W").Delete
Columns("U").Delete
Columns("L").Delete
Columns("G").Delete
Columns("E:B").Delete
  '
Set PlageClass1 = Class1.Worksheets(1).Range("A1").CurrentRegion.Offset(1, 0)
LastLineC1 = PlageClass1.Rows(PlageClass1.Rows.Count).Row
Set PlageClass2 = Class2.Worksheets(1).Range("A1").CurrentRegion.Offset(1, 0)
LastLineC2 = PlageClass2.Rows(PlageClass2.Rows.Count).Row
  'Comparaison
Dim i ' fichier 1
Dim j ' fichier 2
  '
For j = LastLineC2 To 1 Step -1
For i = LastLineC1 To 1 Step -1
 If Cells(i, 4).Text <> Cells(j, 3).Text Then
 Rows(i).Delete
 End If
Next
Next
End Sub

Bonjour

Ton code m'intrigue

If Cells(i, 4).Text <> Cells(j, 3).Text Then

Tu compare la cellule "D" à la cellule "C" du même fichier

C'est à dire le dernier ouvert (Fichier1) qui est le classeur actif

Alors pour moi tu compares les 32000 cellules de la colonne D avec les 190 cellules de la colonne C du même fichier

Il ne manque pas un truc du style

If Cells(i, 4).Text <> Class2.Worksheets(1).Cells(j, 3).Text Then

Mais je peux me tromper

Slt, merci pour la remarque.

Mais je crois que ça revient au même.. J'avais mis au préalabre que le "j" correspond bien au fichier 2.

Bonsoir

Serait possible d'avoir deux fichiers représentatifs de tes données à comparer (Nombre de colonnes, ligne de début etc...)

J'ai bien une idée mais pour la mettre en oeuvre il me faut ces renseignements

Et enfin pour savoir si c'est plus rapide il faut savoir combien de temps tu mets avec ta macro pour éliminer les lignes (nombre de ligne au départ et nombre de ligne en fin)

A suivre

Salut,

désolé pour l'attente

voici les 2 fichiers

merci

15fichier2.zip (4.29 Ko)
23fichier1.zip (11.36 Ko)

Bonjour

Essai non concluant

Je ne connais pas le résultat de ta macro

A voir

Penses à modifier le chemin et le nom des fichiers dans la macro

Bonjour à tous,

Juste pour tester !

ici, j'ai importé la feuille du fichier2 dans le fichier1

Il s'agit d'un filtre élaboré (quasi instantané)

Amicalement

Claude

Banzai64 a écrit :

Je ne connais pas le résultat de ta macro

Re Banzai64,

ça fonctionne, du moins, la suppression. Elle ne dure que 3 secondes

Mais petit problème, il me supprime tout (sauf les en têtes des colones)

Le résultat de la macro est que :

Si la cellule C2 du fichier 2 est égale à une cellule de la colonne D du fichier 1, alors ne pas supprimer cette ligne (du fichier 1).

Faire la même chose pour C3, C4 etc... jusqu'à Cn.

Au final, toutes les lignes du fichier 1, dont le contenu de la colonne D, ne correspond pas au contenu de la colonne C du fichier 2, devront être supprimées. Et les lignes qui correspondentt seront gardées.

J'essaye de comprendre ton code pour voir ce qui cloche, mais je rame car il est balèze

Merci


dubois a écrit :

Bonjour à tous,

Juste pour tester !

ici, j'ai importé la feuille du fichier2 dans le fichier1

Il s'agit d'un filtre élaboré (quasi instantané)

Amicalement

Claude

Salut Dubois,

Merci de ta réponse.

Je ne comprends pas ce que tu veux faire, je parle du "filtre élaboré (quasi instantané)

"

Bonjour

Des incohérences

fopinem a écrit :

Si la celluleD1 du fichier 2 correspond pas à la cellule D1 du fichier 1, alors supprimer la ligne du fichier 1

et maintenant

fopinem a écrit :

Si la cellule C2 du fichier 2 est égale à une cellule de la colonne D du fichier 1, alors ne pas supprimer cette ligne (du fichier 1)

Une fois les colonnes supprimées la nouvelle colonne D dans le fichier 1 c'était la colonne I

Et rien de commun entre la colonne ( I avant suppression colonnes) (ou D après suppression colonnes) du fichier1 avec 1 élément de la colonne C du fichier2

Donc toutes les lignes seront effacées

Si j'ai raté quelque chose, précises-le

Banzai64 a écrit :

Bonjour

Une fois les colonnes supprimées la nouvelle colonne D dans le fichier 1 c'était la colonne I

Oui tas raison sur ce point.

C'est de ma faute. Sur le fichier 1 que j'ai joint, j'ai déjà supprimer les colonnes "W" , "U", "L", "G" et "EàB". Donc pas besoin de les supprimer à nouveau dans le code. Et donc la colone D du fichier 1 contient les mêmes données que la la colonne C du fichier 2. et ce sont les 2 colonnes à comparer.

Cependant dans ton code, il ya :

Columns("E").Insert
  

pourquoi insères tu cette colonne.

Il ya également ça :

  With Range("E2:E" & LastLineC1)
    .Formula = "=IF(COUNTIF('[" & Class2.Name & "]Feuil1'!R2C4:R" & LastLineC2 & "C4,RC[-1])>0,1,"""")"
    .Value = .Value
  End With

je ne comprends pas les 2 lignes codes à l'intérieur du with.

Bonjour

J'insère une colonne car ne connaissant pas ton tableau (n'ayant pas la limite en colonne) c'est le moyen le plus simple pour avoir une colonne libre

Celle-ci est supprimée ensuite

A l'intérieur j'écris une formule style

=SI(NB.SI('[Copie de fichier2.xls]Feuil1'!$D$2:$D$125;D2)>0;1;"")

ensuite je ne veux que le résultat sans la formule donc .Value = .Value

Mais attention avec le fichier que je t'avais envoyé il faut changer la formule dans la macro

.Formula = "=IF(COUNTIF('[" & Class2.Name & "]Feuil1'!R2C3:R" & LastLineC2 & "C3,RC[-1])>0,1,"""")"

Pour avoir la formule suivante

=SI(NB.SI('[Copie de fichier2.xls]Feuil1'!$C$2:$C$124;D2)>0;1;"")

Je te joins une nouvelle version

Toujours la suppression des colonnes

A vérifier et si des soucis indique clairement ce qui ne va pas

Merci beaucoup

ça marche

A bientôt

Rechercher des sujets similaires à "supression lignes prend beaucoup temps"