Compilation de plusieurs de fichiers excel

manueHN -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je souhaite générer un code qui permette d'ouvrir seul un nombre indéfini de fichiers excel afin d'en extraire des données qui se situent au même endroit dans chaque fichier, pour les compiler dans un autre fichier "synthèse" les uns en dessous des autres.

Pour le moment, j'ai réussi à écrire le code ci-dessous. Hors mon programme plante à la ligne "Fichier = Dir(Chemin & "*.xls")", en me mettant "erreur 52". Je ne sais pas comment résoudre le problème. Quelqu'un peut-il m'aider SVP ?

Je reste à disposition si besoin de plus d'information.
Merci d'avance,
Manue.

Code :
Option Explicit

Sub Compilation()

Dim Fichier As String
Dim Chemin As String
Dim ClasseurSource As Workbook

Application.DisplayAlerts = False 'Evite les messages d'Excel
Application.EnableEvents = False 'Evite l'exécution éventuelle de macros liées aux fichiers ouverts

Chemin = Chemin = (Application.Path & "J:\Alpine\Grille maquette temps\essai\feuilles de saisie\") 'Chemin du répertoire contenant les fichiers
Fichier = Dir(Chemin & "*.xls")

Do While Fichier <> ""
Set ClasseurSource = Workbooks.Open(Chemin & Fichier)
ClasseurSource.Worksheets("Feuil2").Select 'nom de la feuille source (commune à tous les fichiers sources)
Range("A49:AI61").Select
Range("A4").Activate
Range(Selection, Selection.End(xlDown)).Select 'selection de la zone à copier
Selection.Copy
ThisWorkbook.Activate
Sheets("Bdd_hres").Select
ActiveSheet.Paste
ClasseurSource.Close
Fichier = Dir
Loop

Application.EnableEvents = True
Application.DisplayAlerts = True

End Sub

<config>Windows 7 / Safari 536.5</config>
A voir également:

11 réponses

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

Regarde cette astuce.Partie 5
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Bonjour,

Sur un grand nombre de fichiers à compiler, il vaut mieux éviter d'ouvrir les fichiers (on peut extraire sur des fichiers fermés)

mais je ne comprends pas cette selection en cascade:
Range("A49:AI61").Select  
Range("A4").Activate  
Range(Selection, Selection.End(xlDown)).  

il ne sert à rien de sélectionner A49:A161 si tu veux extraire A4:A....

à combien peux tu estimer le nombre de lignes maximum ?

version Excel ?

dans l'attente
Michel
0
manueHN
 
Bonjour,

Je me suis peut être emmêlé les pinceaux. Je veux extraire les données présentent dans chaque fichier de la plage A49 à AI61 pour les copier dans un fichier excel "synthèse", onglet "Bdd_hres" à partir de la cellule A4.

et je travaille sur Excel 2003.

Merci pour ton ta réponse
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Re,

Avant de se lancer, tes données en A49:A61 sont elles du m^me type (texte, nombre, date ...)
sinon ..... ?

on restitue "à la suite" sur une seule colonne ou "1colonne par fichier source" ?

le classeur compil est il dans le m^me répertoire que les fichiers source ?
0
manueHN
 
Re,

Pour commencer, toutes mes données à copier sont des chiffres au format "standard".
Sinon, elles sont à copier les unes à la suite des autres, c'est à dire que la première copie sera fait dans le fichier "synthèse", dans l'onglet "Bdd_hres", de la cellule A4 à AI16. Puis la seconde de A17 à AI29, etc... en sachant que dans les fichiers sources la plage à copier est (A49:AI61).
Enfin, tous mes fichiers sont stockés dans un même répertoire "feuilles de saisie". Seul le fichier de "synthèse"est à part (hors du répertoire).
0
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 318
 
Bonjour,

Ci joint proposition de code avec technologie ADO. Je n'ai pas malheureusement le temps de faire une maquette pour le tester; je repasserai demain matin puis Lundi
As tu regardé la proposition de Pijaku ? bonjour Pijaku, y'avait bien longtemps que l'on s'était pas croisé! ca va ? :o)

Const chemin As String = "J:\Alpine\Grille maquette temps\essai\feuilles de saisie\" 
Sub Compilation() 
Dim Fichier As String, Plage As String, Lig As Integer 
Dim source As Object, Requete As Object 

'initialisations générales 
Application.ScreenUpdating = False 
Fichier = Dir(chemin & "*.xls") 
Plage = "feuil2$A49:AI61" 
Lig = 4 

Do While Fichier <> "" 

     'se connecte au fichier en cours 
     Set source = CreateObject("ADODB.Connection") 
    source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
    "Data Source=Fichier ;Extended Properties=""Excel 8.0;HDR=No;"";" 
     
      'exerce la requete ADO sur la plage à recopier 
    Texte_SQL = "SELECT * FROM [" & Plage & "]" 
    Set Requete = CreateObject("ADODB.Recordset") 
    Set Requete = source.Execute(Texte_SQL) 
. 
     'restitution et préparation suivant 
     With Sheets("Bdd_hres") 
          .Cells(Lig, "A").CopyFromRecordset Requete 
          .Lig = Columns("A").Find("*", , , , , xlPrevious).Row + 1 
     End With 
      
     Set Requete = Nothing 
     Set source = Nothing 
     Fichier = Dir 
      
Loop 

End Sub 


Michel
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 769
 
Salut michel,
Oui ça va bien merci. Et toi? Toujours "au taquet" sur les forums? Ca fait plaisir de te croiser à nouveau! je m'étais pris quelques vacances de forum pour cause de surcharge au travail, mais maintenant ça va beaucoup mieux.

Comme ma proposition n'a pas eu l'air d'intéresser le demandeur, je l'a replace ici avec l'adaptation à la demande.

Nécessite la création, dans le classeur de compilation, d'une feuille nommée "Temp" (sans guillemets) la casse et l'orthographe étant important...

Option Explicit    

Sub ImporterDonnees()    
Dim objShell As Object, objFolder As Object    
Dim Chemin As String, fichier 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    
    Chemin = objFolder.ParentFolder.ParseName(objFolder.Title).Path & "\"    
    fichier = Dir(Chemin & "*.xls")    
    Do While Len(fichier) > 0    
        If fichier <> ThisWorkbook.Name Then    
            ThisWorkbook.Names.Add "Plage", _    
            RefersTo:="='" & Chemin & "[" & fichier & "]Feuil2'!$A$49:$AI$61"    
            With Sheets("Temp")    
                .[A49:AI61] = "=Plage"    
                .[A49:AI61].Copy    
                Sheets("Bdd_hres").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues    
              End With    
        End If    
        fichier = Dir()    
    Loop    
End If    
End Sub 


!!! Solution non testée!!!
--
Cordialement,
Franck P
0

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

Posez votre question
manueHN
 
Bonjour,

Merci pour vos réponses.

Je regarde, test et vous tiens au courant.

Bonne fin de journée
0
manueHN
 
Bonjour,

J'ai testé les 2 propositions.

Pour celle de michel_m : lors de l'exécution, VBA me surligne "Texte_SQL" en me disant "variable non définie".

Pour celle de pijaku : elle fonctionne !!! Cependant, est-ce normal que j'ai à choisir le dossier où se trouve tous mes fichiers ? De plus, pourquoi ai-je besoin de rajouter une feuille "Temp" dans mon fichier de synthèse ?

Enfin, pourriez-vous m'expliquer le code car j'ai pas compris (je suis novice en VBA). La technologie ADO, c'est quoi ?

Merci d'avance,
Emmanuelle
0
manueHN
 
Bonjour,

J'espère que vous avez passé un bon week end. Moi j'ai continué à bucher sur mon problème.

Comme je le disais dans mon message précédent, la solution de pijaku fonctionne. Par contre, j'ai rajouté un mot de passe différent à tous mes fichiers sources (un mot de passe par fichier). Par conséquent lorsque je lance la macro, il me demande de saisir chaque mot de passe pour accéder au fichier. N'existe pas un code pour contourner cette protection de fichier.
Je précise que pour protéger mes fichiers, je suis passée par le menu Enregistrer sous / options / mot de passe pour lecture

Merci d'avance pour votre aide.
Emmanuelle
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 769
 
Bonjour,
X fichiers = X mots de passe.... Les mots de passe ont ils au moins quelque chose en commun + une incrémentation exemple :
manue1
manue2
manue3
...
manue5689
etc...
0
manueHN
 
Bonjour,

Les mots de passe n'ont rien en commun. Ils sont choisi par les utilisateurs des fichiers. Ils permettent seulement aux autres utilisateurs de ne pas avoir accès à n'importe quel fichier (seulement au sien).

En fait, je m'explique, chaque fichiers est égal à une feuille de saisie des temps passés. Ce sont des données personnelles et confidentielles, d'où la nécessité de ne pas les rendre accessible à l'ensemble du personnel.

Merci d'avance,
Emmanuelle
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 769
 
Malheureusement, il n'y a rien à faire d'autre que saisir les mots de passe manuellement dans ces conditions...
0
manueHN
 
ah merde ! et y a t il pas un autre moyen de protéger mes fichiers autres que par Enregistrer sous ?

Ce qui permettrait avec un code VBA de déjouer cette protection pour exécuter la macro.
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 769
 
Ces fichiers se trouvent ou?
Tous sur 1 ordinateur?
Un fichier par ordinateur?
Sur un réseau? Un serveur?
0
manueHN
 
Les fichiers se trouvent sur le réseau de l'entreprise, dans un dossier accessible seulement aux personnes concernées. Mais ces personnes ne doivent pas pouvoir accès à un autre fichier que le leur (données confidentielles).

De plus, je te remercie pour ton aide mais peux-tu m'expliquer ton code en français car je n'ai pas tout compris je pense lol

Cordialement,
Emmanuelle
0
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 769
 
Bonjour,

Les explications du code se trouvent dans le lien donné dans ma première réponse : ICI.

Les fichiers se trouvent sur le réseau de l'entreprise, dans un dossier accessible seulement aux personnes concernées.
Suffit donc, dans ce dossier, de créer un dossier par personne et de ne donner l'accès à ce dossier (grâce à propriété/sécurité/autorisations) qu'à la personne concernée...
Si cela fonctionne comme cela, faudra peut être modifier légérement mon code, mais c'est la seule solution que j'entrevois.
0