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 Sub

Bonjour

Tu devrais joindre tes 2 fichiers, en modifiant les noms au besoin....(Nom1,Nom2....)

A te relire.

Bye !

Bonjour gmb,

Tout d'abord merci de me répondre.

Je te mets en PJ mes 2 fichiers.

24sop.xlsm (157.43 Ko)
14annu.xlsm (41.18 Ko)

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 ,

vite fait avant de partir, je te propose ce test (sur base de tes fichiers qui doivent être ouverts )

à peaufiner bien sur

P.

6annu.xlsm (46.94 Ko)
5sop.xlsm (163.36 Ko)

Bonjour à tous

Un essai à tester. Te convient-il ?

Bye !

11sop-v1.xlsm (165.84 Ko)

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.

Rechercher des sujets similaires à "comparaison listes"