Résolu Extraction multi classeurs

ShuarS

XLDnaute Junior
Supporter XLD
Bonjour à tous les XLDnaute :)

Pourriez vous m'aider à construire un bout de code pour réaliser des extractions multi classeurs svp ?

Le dossier "synthese" est directement sous C:\ <C:\synthese>​
Il contient x classeurs Excel enregistrés en .xlsm​
Tous ces classeurs ont tous la même base. Cf fichier "modele" ci joint.​
Tous ces classeurs ont un nom différent. Ex : modele; modele1; modele2; etc.​
Tous ces classeurs contiennent x feuilles avec un nom différent.​

Je voudrais faire un code pour : Cf fichier "consolide" ci joint.

Créer un nouveau classeur en .xlsx sous <C:\temp>​
Le nommer "consolide"​
Ecrire en colonne A tous les noms des différents fichiers xlsm contenus dans le dossier systhese.​
Ecrire en colonne B le nom de la feuille appelée pour le classeur. Ex : 2019 Sem 50​
Ecrire en colonne C la somme de toutes les valeurs. Ex : D2:Q10​

L'idée est de lancer chaque semaine la macro pour capter toutes les infos de la semaine précédente.
Donc les deux variables sont le nom de la feuille suivant le numéro de semaine et la zone de sélection.
Pour cette dernière il est possible de sélectionner D3:Q3 puis de descendre jusqu'en bas avec un Selection.End(xlToDown) peut être.

Je m'embrouille dans les boucles et mes connaissances limitées en VBA ne me permettent pas de réaliser tout ça.
Un peu d'aide serait le bienvenu :)

Merci à vous,
Shu
 

Fichiers joints

xUpsilon

XLDnaute Impliqué
Bonjour,

Pour faciliter l'exploitation d'une boucle, il serait pratique que modele s'appelle "modele0".
Sinon comment savoir quelle semaine prendre ? Y a t'il écrit quelque part la semaine dans laquelle nous sommes ?

Je commence un truc en attendant tes réponses.

Bonne continuation
 

ShuarS

XLDnaute Junior
Supporter XLD
Salut @xUpsilon et merci pour ton aide :)

Tous les fichiers .xlsm contenus dans le dossier systhese ont un nom différent.
Pour être plus précis, chaque classeur porte le nom d'une personne.
On parle d'une centaine de personne donc une centaine de classeurs Excel.

Pour savoir quelle semaine prendre je pensais faire un plus simple.
Chaque feuille porte le nom de la semaine et l'année. Ex : 2019 Sem 50 ; 2019 Sem 51 ; 2019 Sem 52 ; 2020 Sem 01; etc.
On pourrait donc appeler "2019 Sem 50" directement dans le code. Je le modifierais par 2019 Sem 51 la semaine suivant avant de relancer la macro… Pas très propre mais rapide :p
 

xUpsilon

XLDnaute Impliqué
Re,

Ca va prendre un temps infini je pense hein avec une centaine de classeurs.
Bref voir ci-joint un exemple : dans le code Chemin est le nom du chemin pour accéder au dossier (moi mon dossier c'était a stocké dans Documents stocké dans D:. Il faut que tu le remplaces par ton dossier (C:\synthese\) si je ne m'abuse.

Il faut également qu'il n'y aie que "consolider" d'ouvert, pour ne pas que la référence Workbooks(2) soit foirée.
Dis moi ce que tu en penses/les erreurs que tu rencontres.

Bonne continuation
 

Fichiers joints

ShuarS

XLDnaute Junior
Supporter XLD
Merci merci :)
J'ai adapté le fichier mais je n'obtiens rien étrangement.
La valeur "Somme" était non définie. J'ai donc rajouté : Somme As Single.

Mais là je n'ai aucune erreur ni aucun résultat.

J'ai raté quelque chose ?

Edit : Ok désolé j'avais oublié un antislash à la fin du chemin...
Maintenant j'obtiens une erreur lors de la première ouverture du premier fichier.
Erreur d'exécution '1004' sur la ligne "Workbooks.Open (Fichier)"

Il voit bien le nom du fichier mais refuse ou plante pour l'ouvrir apparemment.
Une idée ?
 
Dernière édition:

ShuarS

XLDnaute Junior
Supporter XLD
@xUpsilon , je n'arrive pas à corriger cette erreur :(
J'ai créer des fichiers "simples" pour faire des essais mais je bloque toujours sur l'ouverture du premier fichier.
Pour info je n'utilise pas le bouton 1 qui ne semble être rattaché à rien.
Je lance la macro directement dans VB.

1576516364810.png

Mon chemin d'accès est correct car il retrouve bien le nom du premier fichier. Mais refuse de l'ouvrir.

Une idée please ???
 

Amilo

XLDnaute Accro
Bonjour ShuarS, xUpsilon, le forum,
Je peux vous proposer une solution avec Power query si cela vous intéresse
Cordialement
 

ShuarS

XLDnaute Junior
Supporter XLD
Bonjour @Amilo , merci. Votre solution serait elle complexe ?
J'attends un peu d'aide pour corriger l'erreur et je vais essayer de traiter mon besoin avec VB.
Mais j'utilise Office 365, je possède donc Power Query.
 

xUpsilon

XLDnaute Impliqué
Re,

Très étonnant le fait qu'il te remonte le nom d'un fichier exemple stocké sur mon ordi perso. Sinon pour réinitialiser une mémoire éventuelle tu pourrais supprimer la ligne, enregistrer et fermer ton fichier, puis le rouvrir et réinsérer la ligne et voir si ça fonctionne.

Bonne continuation
 

ShuarS

XLDnaute Junior
Supporter XLD
Bonjour @xUpsilon ,
Non il remonte le nom du premier fichier qui se trouve dans mon dossier test.
Mais il refuse de l'ouvrir.
J'ai fait un essai avec des nouveaux classeurs Excel, même problème.

Une idée ?
 

xUpsilon

XLDnaute Impliqué
Re,

Tu as un fichier s'appelant "Classeur 1 - Copie (2).xlsm" dans ton dossier test ?
Sinon, l'erreur pourrait venir du fait que les fichiers ouverts ne contiennent pas de feuille nommée suivant le terme que tu entres en début de macro.

Dis m'en plus
 

ShuarS

XLDnaute Junior
Supporter XLD
Oui.

1576570811567.png

Code:
Sub BoucleFichiers()
    Dim Chemin As String, Fichier As String, i As Integer, Semaine As String, Somme As Single
    
    i = 1
    Semaine = InputBox("Quel est le mois de l'année ? (format aaaa Sem ss)")
    'Définit le répertoire contenant les fichiers
    Chemin = "C:\test\a\"
 
    'Boucle sur tous les fichiers xls du répertoire.
    Fichier = Dir(Chemin & "*.xlsm")
    'Utilisez la syntaxe suivante pour boucler sur tous les types de fichiers :
    'Fichier = Dir(Chemin & "*.*")
 
    Do While Len(Fichier) > 0
        'écrit le résultat dans la fenêtre d'exécution (Ctrl+G).
        Workbooks.Open (Fichier)
        Workbooks("consolide.xlsm").Worksheets(1).Range("A" & i) = Fichier
        Workbooks("consolide.xlsm").Worksheets(1).Range("B" & i) = Semaine
        Somme = WorksheetFunction.Sum(Workbooks(2).Worksheets(Semaine).Range("D3:H100"))
        Workbooks("consolide.xlsm").Worksheets(1).Range("C" & i) = Somme
        Workbooks(2).Close
        i = i + 1
        Debug.Print Chemin & Fichier
        Fichier = Dir()
    Loop
End Sub
1576571093135.png

Débogage :

1576571118126.png

Je ne comprends pas...
 

xUpsilon

XLDnaute Impliqué
Je viens de faire un essai et ça ne fonctionne plus non plus sur mon pc.
Je regarde ça et te redis.

Bonne continuation
 

xUpsilon

XLDnaute Impliqué
Re,

Regarde ci-joint : Il faut mettre Workbooks.Open (Chemin & Fichier) car comme Fichier est un Dir( ), il perd le chemin et ne garde comme valeur que le nom du fichier seul.

Bonne continuation
 

Fichiers joints

ShuarS

XLDnaute Junior
Supporter XLD
Arf je suis vraiment pas bon :p
En effet il arrive à l'ouvrir maintenant, merci :)

Par contre il plante sur la ligne somme. Il s'arrête là, ne fait pas la somme.
VB:
Somme = WorksheetFunction.Sum(Workbooks(2).Worksheets(Semaine).Range("D3:H100"))
1576574328394.png

Je n'ai que le classeur "consolide" ouvert.
 
Dernière édition:

xUpsilon

XLDnaute Impliqué
Bizarre, as-tu entré la bonne semaine dans l'Input ? Est-ce que la feuille de tes documents est nommée avec la même semaine ?
 

xUpsilon

XLDnaute Impliqué
Bizarre je n'ai pas de souci de mon problème.
En essayant de sortir cette erreur j'ai réussi à l'avoir en ayant trop de classeurs ouverts. Est-ce que consolide est le seul classeur ouvert lorsque tu lances la macro ?
 

ShuarS

XLDnaute Junior
Supporter XLD
Oui j'ai même vérifié dans mes processus pour être sûr.
J'ai aussi affecté la macro sur le bouton 1 pour fermer VB.
J'ai donc uniquement le classeur "consolide" ouvert, le clic sur le bouton 1, je rentre le nom de la feuille recherché càd "2019 Sem 50" puis OK.
Tous les classeurs ont bien leur feuille nommée "2019 Sem 50".

Résultat :
Le nom du premier classeur est bien ramené en A1 sur classeur "consolide";
Le nom de la feuille est bien ramené en B1 "2019 Sem 50";
Plantage de la macro sur Erreur d'exécution 9 sur la ligne :
VB:
Somme = WorksheetFunction.Sum(Workbooks(2).Worksheets(Semaine).Range("D3:H100"))

Code complet :
Code:
Sub BoucleFichiers()
    Dim Chemin As String, Fichier As String, i As Integer, Semaine As String
        
    i = 1
    Semaine = InputBox("Quel est le mois de l'année ? (format aaaa Sem ss)")
    Chemin = "C:\test\a\"
    Fichier = Dir(Chemin & "*.xlsm")
    Do While Len(Fichier) > 0
        Workbooks.Open (Chemin & Fichier)
        Workbooks("consolide.xlsm").Worksheets(1).Range("A" & i) = Fichier
        Workbooks("consolide.xlsm").Worksheets(1).Range("B" & i) = Semaine
        Somme = WorksheetFunction.Sum(Workbooks(2).Worksheets(Semaine).Range("D3:H100"))
        Workbooks("consolide.xlsm").Worksheets(1).Range("C" & i) = Somme
        Workbooks(2).Close
        i = i + 1
        Debug.Print Chemin & Fichier
        Fichier = Dir()
    Loop
End Sub
 

xUpsilon

XLDnaute Impliqué
Somme semble ne pas avoir été déclaré en variable ici (je pense pas que ce soit la source du problème mais bon).
Sinon je t'avoue que je ne comprends pas. Si tu mets Workbooks(Fichier) à la place de Workbooks(2) ça donne quoi ?
La plage de sommation est la bonne ? (D3:H100)

Je continue de chercher
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas