Macro pour importer donnees de plusieurs classeurs

Bonjour,

Je souhaite créer une macro qui stoque les données de plusieurs classeurs d'un même répertoire dans un classeur unique ( appelons le BDDBenoit2). Chaque classeur dispose de plusieurs feuilles ( ex: FormulaireAuvents, FormulaireGC ... ) et ces feuilles sont les mêmes dans BDDBenoit2.

J 'ai le code de la macro d'importation d'un classeur suivante, mais cela ne marche pas :

Sub Imports()
'
' Imports Macro
'

'
Workbooks.Open Filename:= _
"\\192.168.0.3\Public\FSB\Boitenoire\utilisateur_26_06_2013_10_04_23_.xls"
Windows("utilisateur_26_06_2013_10_04_23_.xls").Activate
Selection.Copy
Windows("BDDBenoit2.xlsm").Activate
ActiveSheet.Paste
Sheets("FormulaireGC").Select
Windows("utilisateur_26_06_2013_10_04_23_.xls").Activate
Sheets("FormulaireGC").Select
Range("A2:M4").Select
Application.CutCopyMode = False
Selection.Copy
Windows("BDDBenoit2.xlsm").Activate
Range("A3").Select
ActiveSheet.Paste
Windows("utilisateur_26_06_2013_10_04_23_.xls").Activate
Sheets("FormulaireEsc").Select
Range("A2:L4").Select
Application.CutCopyMode = False
Selection.Copy
Windows("BDDBenoit2.xlsm").Activate
Sheets("FormulaireEsc").Select
Range("A2").Select
ActiveSheet.Paste
Sheets("FormulaireBV").Select
Windows("utilisateur_26_06_2013_10_04_23_.xls").Activate
Sheets("FormulaireBV").Select
Range("A2:J4").Select
Application.CutCopyMode = False
Selection.Copy
Windows("BDDBenoit2.xlsm").Activate
Range("A2").Select
ActiveSheet.Paste
Windows("utilisateur_26_06_2013_10_04_23_.xls").Activate
Sheets("FormulairePortes").Select
Range("I2:Q4").Select
Application.CutCopyMode = False
Selection.Copy
Windows("BDDBenoit2.xlsm").Activate
Sheets("FormulairePortes").Select
Range("A2").Select
ActiveSheet.Paste
Windows("utilisateur_26_06_2013_10_04_23_.xls").Activate
Sheets("FormulaireMC").Select
Range("A2:K4").Select
Application.CutCopyMode = False
Selection.Copy
Windows("BDDBenoit2.xlsm").Activate
Sheets("FormulaireMC").Select
Range("A2").Select
ActiveSheet.Paste
Windows("utilisateur_26_06_2013_10_04_23_.xls").Activate
Sheets("FormulairePC").Select
Range("A2:L4").Select
Application.CutCopyMode = False
Selection.Copy
Windows("BDDBenoit2.xlsm").Activate
Sheets("FormulairePC").Select
Range("A2").Select
ActiveSheet.Paste
Windows("utilisateur_26_06_2013_10_04_23_.xls").Activate
ActiveWindow.ScrollWorkbookTabs Position:=xlLast
ActiveWindow.ScrollWorkbookTabs Position:=xlLast
Sheets("FormulairePB").Select
Range("A2:N4").Select
Application.CutCopyMode = False
Selection.Copy
Windows("BDDBenoit2.xlsm").Activate
Sheets("FormulairePB").Select
Range("A2").Select
ActiveSheet.Paste

End Sub

5 réponses

  1. Modérateur
    Bonjour,

    Tu peux aller lire cette fiche pratique. Si cela te convient reviens ici demander l'adaptation à ton cas.
    0
    1. Bonjour pijaku.

      Ton code semble être le bon, mais est-ce qu'il peut marcher si dans chaque classeur il y a plusieurs feuilles contenant des données à importer ?
      0
      1. Modérateur
        Oui, je penses.
        Il suffit d'adapter le code...
        0
        1. OK . Du coup tu pourrai me donner un exemple d'importation de 2 classeurs contenant 2 feuilles chacun ?
          0
          1. Modérateur
            J'ai essayé d'adapter mon code à ton cas précis.
            C'est pas simple simple sans pouvoir tester...

            Bon, à toi donc de tester cette macro.
            Adapte là d'abord, il y a pour cela plusieurs commentaires dans le code.

            Pour tester :
            1- Fais une copie du répertoire dans lequel tu as tous tes fichiers
            2- renomme cette copie
            3- travaille à partir de la copie de tes fichiers, pas sur les originaux
            4- reviens ici me dire ce qui aura planté....

            Option Explicit
            
            Sub Importer()
            Dim objShell As Object, objFolder As Object
            Dim Chemin As String, fichier As String
            Dim Ws As Worksheet, maPlageExp As String, Col As String
            Dim Erreur As Boolean, maPlageImp As String
            
                Set objShell = CreateObject("Shell.Application")
                Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&)
            
            If objFolder Is Nothing Then
                MsgBox "Abandon opérateur", vbCritical, "Annulation"
            Else
                ThisWorkbook.Sheets.Add After:=Sheets(Sheets.Count)
                ActiveSheet.Name = "TravailEnCours"
                Sheets("FormulaireGC").Select 'ICI, peu importe le nom de la feuille, mets en un qui existe dans le classeur BDDBenoit2.xlsm
                                                'il faut juste sélectionner une autre feuille que celle que l'on vient d'ajouter
                Chemin = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\"
                '************************************A ADAPTER : tes fichiers sont ils tous .xls???
                fichier = Dir(Chemin & "*.xls")
                '************************************
                Do While Len(fichier) > 0
                    If fichier <> ThisWorkbook.Name Then
                        '****************************A ADAPTER : l'Array doit contenir le nom des feuilles à importer
                            '!!!Précaution, assures toi que ces feuilles sont bien dans le classeur BDDBenoit2.xlsm
                        For Each Ws In ThisWorkbook.Worksheets(Array("FormulaireGC", "FormulaireEsc", "FormulaireBV", "FormulairePortes", "FormulaireMC", "FormulairePC", "FormulairePB"))
                            Erreur = False
                            'ici on attribue la bonne plage en fonction de la feuille importée '*********** A ADAPTER
                                'maPlageExp est la plage de cellules des fichiers à importer
                                'maPlageImp est la même plage de cellules, mais dans le fichier BDDBenoit2.xlsm
                            Select Case Ws.Name
                                Case "FormulaireGC"
                                    maPlageExp = "FormulaireGC'!$A$2:$M$4"
                                    maPlageImp = "A2:M4"
                                    Col = "A"
                                Case "FormulaireEsc"
                                    maPlageExp = "FormulaireEsc'!$A$2:$L$4"
                                    maPlageImp = "A2:L4"
                                    Col = "A"
                                Case "FormulaireBV"
                                    maPlageExp = "FormulaireBV'!$A$2:$J$4"
                                    maPlageImp = "A2:J4"
                                    Col = "A"
                                Case "FormulairePortes"
                                    maPlageExp = "FormulairePortes'!$I$2:$Q$4"
                                    maPlageImp = "I2:Q4"
                                    Col = "I"
                                Case "FormulaireMC"
                                    maPlageExp = "FormulaireMC'!$A$2:$K$4"
                                    maPlageImp = "A2:K4"
                                    Col = "A"
                                Case "FormulairePC"
                                    maPlageExp = "FormulairePC'!$A$2:$L$4"
                                    maPlageImp = "A2:L4"
                                    Col = "A"
                                Case "FormulairePB"
                                    maPlageExp = "FormulairePB'!$A$2:$N$4"
                                    maPlageImp = "A2:N4"
                                    Col = "A"
                                Case Else
                                    MsgBox "Feuille inconnue"
                                    Erreur = True
                            End Select
                            If Erreur = False Then
                                ThisWorkbook.Names.Add "Plage", RefersTo:="='" & Chemin & "[" & fichier & "]" & maPlageExp
                                With Sheets("TravailEnCours")
                                    .Range(maPlageImp) = "=Plage"
                                    .Range(maPlageImp).Copy
                                    ThisWorkbook.Sheets(Ws.Name).Range(Col & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
                                    .Cells.Clear
                                End With
                            End If
                        Next Ws
                    End If
                    fichier = Dir()
                Loop
                Application.DisplayAlerts = False
                Sheets("TravailEnCours").Delete
                Application.DisplayAlerts = True
            End If
            End Sub

            0