Comparaison de 2 listes
Bonjour le forum,
J'ai un souci de lenteur dans une macro. J'ai 2 fichiers Excel contenant chacun une liste d'employés.
Lorsque ma macro s'éxecute (depuis un fichier Excel ouvert), elle vient ouvrir en masqué le 2nd fichier, puis, à partir du second fichier, je vais chercher pour chaque employé, s'il est présent dans mon fichier ouvert. Sil ne l'est pas, il vient se rajouter à la fin de ma liste dans mon fichier ouvert.
Pour résumer : j'ai un fichier ouvert avec une liste d'employé, tous les employés du fichier masqué qui ne sont pas dans mon fichier ouvert, viennent s'ajouter à la fin du fichier.
Cette macro fonctionne parfaitement... Mais elle met beaucoup beaucoup trop de temps. Pouvez-vous m'aider à trouver le "pourquoi" du "comment" svp ?
Je vous remercie par avance.
Je pense qu'il s'agit de l'incrémentation de ma boucle. Voici ma macro :
'Numéro de la première ligne de la feuille ANNU MSI
Public Const Pre_Nom As Long = 8
'Procédure permettant de mettre à jour la liste des employés
Sub MaJ_Effectif()
Dim Wb_Annu As Workbook
Dim i As Long, j As Long, k As Long, Fin As Long
Dim DernLigne As Long, Last_Row As Long, Last_Row2 As Long
Dim Nom_Annu As String, Prenom_Annu As String
Dim Chemin As String
Dim Appli_Annu As Excel.Application
Dim WsE As Worksheet, WsIn As Worksheet, WsOut As Worksheet
Dim WsA As Worksheet
On Error Resume Next
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayStatusBar = False
'Création d'une nouvelle instance d'Excel le paramétrage qui suit la masquera
Set Appli_Annu = VBA.CreateObject("Excel.Application")
With Appli_Annu
.Visible = False
.ScreenUpdating = False
.EnableEvents = False
.DisplayStatusBar = False
End With
Set WsE = Sheets("Liste des effectifs")
DernLigne = WsE.Range("C" & Rows.Count).End(xlUp).Row
'On récupère le chemin du fichier qui est stipulé dans l'onglet Effectif à côté de la liste des employés
Chemin = WsE.Range("AJ1").Value
Set Wb_Annu = Appli_Annu.Workbooks.Open(Chemin, xlUpdateLinksNever, True)
Set WsA = Wb_Annu.Sheets("ANNU")
'On récupère la dernière ligne de l'onglet ANNU
Last_Row2 = WsA.UsedRange.Rows.Count
'Comparaison des effectifs du SOP et du fichier annu
For j = Pre_Nom To Last_Row2
For i = 2 To DernLigne
If ((WsA.Cells(j, 5).Value = WsE.Cells(i, 3).Value) And (WsA.Cells(j, 6).Value = WsE.Cells(i, 4).Value)) Then
Exit For
ElseIf ((WsA.Cells(j, 5).Value <> WsE.Cells(i, 3).Value) And (WsA.Cells(j, 6).Value <> WsE.Cells(i, 4).Value)) Then
If i = DernLigne Then
WsE.Cells(i + 1, 1).Value = WsA.Cells(j, 4).Value
WsE.Cells(i + 1, 2).Value = WsA.Cells(j, 3).Value
WsE.Cells(i + 1, 3).Value = WsA.Cells(j, 5).Value
WsE.Cells(i + 1, 4).Value = WsA.Cells(j, 6).Value
DernLigne = DernLigne + 1
Exit For
End If
End If
Next i
Next j
'Fermeture du fichier des annu sans enregistrements
Wb_Annu.Close savechanges:=False
Set WsE = Nothing
Set WsIn = Nothing
Set WsOut = Nothing
Set WsA = Nothing
Set Wb_Annu = Nothing
Appli_Annu.Quit
Set Appli_Annu = Nothing
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayStatusBar = True
MsgBox ("Mise à jour de l'effectif réussie")
If VBA.Err.Number Then
VBA.MsgBox VBA.Err.Number & " : " & VBA.Err.Description, vbInformation, " Erreur liée à la Sub MaJ_EFFECTIF"
VBA.Err.Clear
End If
End SubBonjour
Tu devrais joindre tes 2 fichiers, en modifiant les noms au besoin....(Nom1,Nom2....)
A te relire.
Bye !
Bonjour,
les noms/prénoms ok , mais quand est il des colonnes A-B de SOP et CD de l'autre fichier ?
la personne NOM1-Prenom1 n'a pas les même données dans les 2 colonnes à gauche ...
quelle données sont les bonnes et que tu devras donc garder ?
P.
Bonjour Patrick,
Cela ne gene pas (pour le test), puisque la macro compare le nom ET prénom.
Peu importe les données des autres colonnes, si l'employé (NOM et PRENOM) du fichier ANNU n'est pas présent dans le fichier SOP, alors il vient se rajouter en fin de fichier SOP.
Mon souci est que ca met trop trop de temps...
Je pense que cela vient de ma boucle.
Bonjour à vous 2,
Je vais tester chacune de vos solutions et je reviens vers vous ! Merci beaucoup
J'ai pris au hasard 1 des 2 solutions, et ça marche !
Du coup merci à vous 2, c'est super cool.
J'ai choisie ta solution gmb. Cela me convient parfaitement. Mais maintenant j'ai une question : pourquoi ma macro met trois ans pour s'executer ? Elle fonctionne mais ca met 3 4 minutes à s'executer... Et j'aimerais savoir pourquoi ?
Si par hasard tu pouvais me dire pourquoi...
A+ le forum
Excellium a écrit :pourquoi ma macro met trois ans pour s'executer ?
J'avoue humblement que je n'ai pas tout compris dans ta macro, c'est pourquoi j'ai préféré tout reprendre à ma manière...
Il m'a semblé toutefois qu'elle faisait ouvrait une nouvelle instance d'Excel... Peut-être cela vient-il de là ? Avec Excel ouvert 2 fois, tu as beaucoup de mémoire vive occupée et cela fait ramer davantage ton PC... Mais cela n'est qu'une supposition.
Bye !
Bonjour,
C'est plus lent parce que tu écris dans la feuille à chaque opération, alors que en mettant tout dans un tableau , on colle le résultat à l'endroit voulu, après avoir traité les données en mémoire
C'est toujours plus rapide comme ça; il suffit de tester sur 100.000 lignes tu verras
P.