Compilation de plusieurs de fichiers excel
manueHN
-
pijaku Messages postés 13513 Date d'inscription Statut Modérateur Dernière intervention -
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>
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:
- Compilation de plusieurs de fichiers excel
- Liste déroulante excel - Guide
- Formule moyenne excel plusieurs colonnes - Guide
- Renommer plusieurs fichiers en même temps - Guide
- Word et excel gratuit - Guide
- Somme de plusieurs cellules excel - Guide
11 réponses
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:
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
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
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).
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).
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)
Michel
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
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...
!!! Solution non testée!!!
--
Cordialement,
Franck P
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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
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
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...
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...
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
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
Malheureusement, il n'y a rien à faire d'autre que saisir les mots de passe manuellement dans ces conditions...
Ces fichiers se trouvent ou?
Tous sur 1 ordinateur?
Un fichier par ordinateur?
Sur un réseau? Un serveur?
Tous sur 1 ordinateur?
Un fichier par ordinateur?
Sur un réseau? Un serveur?
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
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
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.
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.