Macro pour importer donnees de plusieurs classeurs

TheYéti Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   -
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

pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Bonjour,

Tu peux aller lire cette fiche pratique. Si cela te convient reviens ici demander l'adaptation à ton cas.
0
TheYéti Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
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
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Oui, je penses.
Il suffit d'adapter le code...
0
TheYéti Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
OK . Du coup tu pourrai me donner un exemple d'importation de 2 classeurs contenant 2 feuilles chacun ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
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