Macro de recherche sur classeurs multiples

Le problème est que je n'y connais rien en Mac... Vive la pomme

Cependant...

Ce code ne peut ouvrir que des fichiers .xls.

Essaie donc de remplacer :

" {""com.microsoft.Excel.xls""} " & _

par

" {""com.microsoft.Excel.xlsx""} " & _

... pour voir.

Désolé, la résolution de ton problème risque de prendre du temps en raison de ma méconnaissance de ton système d'exploitation...

Mais nous y arriverons.

ça fonctionne pas...par contre, ça fonctionne quand j'enregistre mes fichiers en xls mais le problème est que les enregistrer dans ce format n'enregistre qu'une partie...

Sinon saches que tu n'as pas à être désolé, je ne peux qu'être reconnaissant de l'aide que tu m'apportes!

Peux tu essayer ce classeur?

Tu l'ouvres, clic sur GetFiles.

Si tu obtiens un résultat, tu enregistres le classeur et me le repasse par ici...

7macgetfiles.xlsm (31.66 Ko)

Idem, ça ouvre une fenêtre de choix avec mes fichiers mais impossible de les sélectionner.

Et si...

Peux tu me donner le résultat de :

Sub Test()
    MsgBox Application.PathSeparator
End Sub

je l'exécute à partir de quel fichier?

Peu importe...

en PJ la réponse. Sinon, j'ai ressorti mon vieux pc portable, pour l'instant ça tourne mais je crains que ça ne fasse planter la machine...vu qu'il n'est plus tout jeune!!


donc la PJ

capture d e cran 2014 11 21 a 13 59 35

Alors essayons comme ceci :

Le fichier contenant la macro doit être dans le même répertoire que le fichier "fichier 1.xlsx"

Option Explicit

Const Fichier1 As String = "fichier 1.xlsx" 'ici le fichier de "base"

Sub Import_Trois_Fichiers()
Dim Wbk_Sourc As Workbook
Dim Chemin As String

Chemin = ThisWorkbook.Path & Application.PathSeparator
Application.ScreenUpdating = False

'¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ IMPORT FICHIER 1 ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
Set Wbk_Sourc = Workbooks.Open(Chemin & Fichier1)
End Sub

Bon, ce code a je pense fonctionné puisqu'il a ouvert le fichier 1!

Grrrr....

Donc, depuis le début c'est un problème de chemin d'accès..........

Alors voilà :

 Option Explicit

    '!!!!!!!!!!! ¤¤¤¤¤¤¤¤¤¤¤¤ A ADAPTER : les noms des fichiers et des feuilles ¤¤¤¤¤¤¤¤¤ !!!!!!!!!!!!!

    Const Fichier1 As String = "fichier 1.xlsx" 'ici le fichier de "base"
    Const Fichier2 As String = "fichier 2-1.xlsx" 'ici le fichier qui contient la colonne "Allègement"
    Const Fichier3 As String = "fichier 3-1.xlsx" 'ici le fichier qui contient les colonnes "Heures Supp"
    Const NomFeuil_1 As String = "Feuil1" 'feuille du fichier de base
    Const NomFeuil_2 As String = "Feuil1" 'feuille du fichier2
    Const NomFeuil_3 As String = "Feuil1" 'feuille du fichier3

    Sub Import_Trois_Fichiers()
    Dim Wbk_Sourc As Workbook
    Dim Tb_In_Fich1(), Tb_In_Fich2(), Tb_In_Fich3(), Tb_Out()
    Dim DLig As Long, L As Long, Lig As Long, Col As Integer, T As Single
    Dim Chemin As String

    'IMPORTANT :
       'J'ai estimé que le fichier fichier1 comportait toutes les données
       'contenues dans les deux autres fichiers, voire plus encore.
       'Si ce n'est pas le cas, il faudrait nous en dire davantage.

    T = Timer
    Chemin = ThisWorkbook.Path & Application.PathSeparator
    Application.ScreenUpdating = False

    '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ IMPORT FICHIER 1 ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    Set Wbk_Sourc = Workbooks.Open(Chemin & Fichier1)
    With Wbk_Sourc
        With .Sheets(NomFeuil_1)
            DLig = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
            Tb_In_Fich1 = .Range("A2:G" & DLig).Value
        End With
        .Close
    End With
    Tb_Out = Tb_In_Fich1
    ReDim Preserve Tb_Out(1 To UBound(Tb_In_Fich1, 1), 1 To UBound(Tb_In_Fich1, 2) + 7)
    Erase Tb_In_Fich1

    '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ IMPORT FICHIER 2 ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ Colonne "URSAFF Allègement"
    Set Wbk_Sourc = Workbooks.Open(Chemin & Fichier2)
    With Wbk_Sourc
        With .Sheets(NomFeuil_2)
            DLig = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
            Tb_In_Fich2 = .Range("A2:F" & DLig).Value
        End With
        .Close
    End With
    For L = 1 To UBound(Tb_Out, 1)
        For Lig = 1 To UBound(Tb_In_Fich2, 1)
            'Si les trois premières colonnes sont identiques
           If Tb_In_Fich2(Lig, 1) = Tb_Out(L, 1) And Tb_In_Fich2(Lig, 2) = Tb_Out(L, 2) And Tb_In_Fich2(Lig, 3) = Tb_Out(L, 3) Then
                Tb_Out(L, 8) = Tb_In_Fich2(Lig, 6): Exit For
            End If
        Next Lig
    Next L
    Erase Tb_In_Fich2

    '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ IMPORT FICHIER 3 ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ Colonnes "Heures Supp"
    Set Wbk_Sourc = Workbooks.Open(Chemin & Fichier3)
    With Wbk_Sourc
        With .Sheets(NomFeuil_3)
            DLig = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
            Tb_In_Fich3 = .Range("A2:K" & DLig).Value
        End With
        .Close
    End With
    For L = 1 To UBound(Tb_Out, 1)
        For Lig = 1 To UBound(Tb_In_Fich3, 1)
            'Si les trois premières colonnes sont identiques
           If Tb_In_Fich3(Lig, 1) = Tb_Out(L, 1) And Tb_In_Fich3(Lig, 2) = Tb_Out(L, 2) And Tb_In_Fich3(Lig, 3) = Tb_Out(L, 3) Then
                For Col = 1 To 6
                    Tb_Out(L, 8 + Col) = Tb_In_Fich3(Lig, 5 + Col)
                Next Col
                Exit For
            End If
        Next Lig
    Next L
    Erase Tb_In_Fich3

    '¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ RESTITUTION DES DONNEES ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
    Range("A2").Resize(UBound(Tb_Out, 1), UBound(Tb_Out, 2)) = Tb_Out
    Application.ScreenUpdating = True
    MsgBox "Travail terminé en : " & Timer - T & " secondes."
    End Sub

Maintenant que l'on a réussi à passer la première ligne du code, j’attends que tu me donnes le second plantage

Que voici :

Erreur de compilation :

Erreur de syntaxe

En PJ, ce qui est surligné en jaune.

capture d e cran 2014 11 21 a 14 26 06

Oui, j'ai édité mon message précédent. Il y a un & en trop...

Juste pour précision et en réponse au message "Important" dans le code, le fichier 1 comporte les mêmes données que le fichier 2 et 3 sauf les HS et Allègement. Je préfère le signaler pour pas qu'il est de soucis plus tard


Bon pour l'instant je n'ai pas eu de nouveau msg d'erreurs, ça a l'air de tourner...wait & see!

Voilà 1h30 que ça tourne, rien ne se passe. Je le laisse tourner quelques heures sinon, j'essaierai ce code sur des fichiers réduits!

Je te tiens au courant,

Bon week-end et un grand merci.

Bonjour à tous,

La méthode par VBA n'est pas la bonne en réalité.

Il faut toujours penser Excel avant de penser VBA, j'aurais du commencer par là.

Bon. Il est évident que deux doubles-boucles sur plus de 100 000 lignes vont durer une éternité.

Le but est donc de trier tes trois classeurs afin de faire correspondre chaque ligne.

Si ce n'est pas déjà le cas, pour atteindre ce résultat, il te faut utiliser la fonction de tri.

Tu devrais trier donc tes données en fonction de tes trois colonnes A, B, C.

Une fois ce tri réalisé, tu devrais avoir 3 fichiers dont les trois premières colonnes sont identiques.

Tu n'auras donc plus qu'à copier-coller les colonnes manquantes dans le fichier 1.

Bonne journée

ps : J'aurais vraiment dû commencer par là...

Bonjour,

Merci pour l'info mais je crains que cette méthode soit aussi longue que faire tourner la macro. Il faut que je vérifie à chaque fois que la correspondance est bonne à cause de certains doublons qui viennent décaler les valeurs, et ça je dois le faire 2 fois (une fois pour les HS et une fois pour l'allègement).

J'ai essayé la macro sur une petite partie et ça fonctionne hormis le fait que ça ne renseigne que les infos de base (date/matricule/nom/prénom/salaire) et pas le reste (HS et allègement).

En tout cas merci de ton aide.

Il faut que je vérifie à chaque fois que la correspondance est bonne à cause de certains doublons qui viennent décaler les valeurs, et ça je dois le faire 2 fois (une fois pour les HS et une fois pour l'allègement).

Tu as deux manières pour vérifier les doublons et la correspondance :

  • par formule : si tes données sont triées selon les trois premières colonnes, et que tu viens coller les trois premières colonnes des autres fichiers + la (les) colonne(s) qui t'intéressent, tu peux avec la formule =EXACT trouver la correspondance et NB.SI (ou NB.SI.ENS) te donnera les doublons
  • par Mise en Forme Conditionnelle avec les formules EXACT et NB.SI

Ainsi tu visualise rapidement les correspondances et/ou les doublons.

Pour la macro, imaginons que chaque fichier fasse 100 000 lignes.

On doit boucler 100 000 fois sur 100 000 lignes et ceci deux fois (tu as trois fichiers). Même en sortant régulièrement de la seconde boucle For comme je te l'ai fait, on peut imaginer que la macro sera extrêmement longue. Par contre, tu aurais du avoir un résultat probant...

Oui, c'est sur que vu comme ça...Je vais faire comme tu dis et advienne que pourra!

En tout cas encore un grand merci d'avoir consacré autant de temps, c'est vraiment appréciable de trouver de l'aide aussi réactive et efficace!

Rechercher des sujets similaires à "macro recherche classeurs multiples"