Création macro pour aller chercher info dans autre classeur

Bonjour tout le monde !

Je suis tout à fait novice dans le fabuleux univers du VBA, et on m'a confié une tâche pour laquelle je manque cruellement d'expérience.

Plusieurs de mes collaborateurs me fournissent des fichiers de pointage qui reprennent le résumé de leur différentes activités. Ces fichiers sont construits de la même façon. Je dois regrouper les informations qu'ils contiennent dans un fichier global. Ce qui m'intéresse c'est seulement de récupérer le contenu des différentes lignes, sans s'occuper des formules, j'ai juste besoin du texte.

Les fichiers seront nommés différemment (en fonction de la date) à chaque fois, mais seront placés dans le même dossier.

Le nombre de ces collaborateurs peut être amené à évoluer (nouvelles personnes).

Le macro doit être capable d'aller chercher tout fichier excel présent dans un dossier donné, récupérer toutes les lignes, ajouter ces lignes dans mon fichier de synthèse.

Ma demande est-elle claire ?

Merci d'avance pour vos réponse !

Bonjour Heutrust, bonjour le forum,

Ta demande est claire et réalisable. Juste quelques petites question :

  • Les fichiers source (qui contiennes les données à rapatrier) ont-il un seul onglet ou plusieurs ?
  • Faut-il rapatrier les donnés de tous les onglets ?
  • Si non, quel onglet ? Est-il le même pour tous les fichiers ?
  • Le fichier destination (que tu nommes fichier Global) se trouve-t-il dans le même dossier que les fichiers sources ?
  • Si non, peux tu nous donner les chemins d'accès des fichiers sources et du fichier destination...
  • Quand on traite les données, on traite tous les fichiers ou seulement certains par rapport à une date ?

Pourrais-tu mettre en pièce jointe un fichier source pour qu'on voit sa structure...

Salut ! Merci pour la rapidité de ta réponse !

- Les fichiers source (qui contiennes les données à rapatrier) ont-il un seul onglet ou plusieurs ?

Oui le fichier source contient plusieurs onglets,

- Faut-il rapatrier les donnés de tous les onglets ?

mais je n'ai besoin de récupérer les données que d'un seul onglet

- Si non, quel onglet ? Est-il le même pour tous les fichiers ?

l'onglet Suivi. Oui.

- Le fichier destination (que tu nommes fichier Global) se trouve-t-il dans le même dossier que les fichiers sources ?

Oui

- Quand on traite les données, on traite tous les fichiers ou seulement certains par rapport à une date ?

Il s'agit de traiter tous les nouveaux fichiers excel ajoutés dans le dossier. On suppose que les fichiers sources contiennent la date de livraison ainsi que le nom de l’émetteur.

Je joins à ce post un exemple de fichier sources avec seulement 3 lignes de remplies. On suppose qu'il peut y avoir beaucoup plus de lignes à récupérer. J'ai du supprimer les onglets car sinon mon fichier est trop volumineux.

Petite précision, le fichier global doit reprendre le nom des colonnes des fichiers sources (les même pour tous les fichiers) et en ajouter une dans laquelle viendra s'ajouter le nom de l'émetteur du fichier. Pour être plus clair, il s'agit d’identifier à qui appartiennent les données collectées.

Bonjour Heutrust, bonjour le forum

Donc 'si j'ai bien compris, on doit traiter tous les fichiers dont la date est la plus proche de la date du jour ? Comment savoir si elles n'ont pas déjà été traitées ? Pourrait-on renommer le fichier après traitement pour éviter de les refaire ?

Tu me dis d'ajouter en colonne pour le nom de l'émetteur ? C'est bien la donnée qui se trouve dans les cellules fusionnées A1:B1 ?

En attendant tes réponses voici la première proposition. Tu peux lancer la procédure en double-cliquant le Nº Devis.

Elle :

• commence par effacer les éventuelles anciennes données contenues dans le classeur

• ouvre les fichiers source les uns près les autres

• revoie les données source dans la classeur destination les uns an dessous des autres

• ferme le classeur source

• après un message de fin, sauve le classeur destination...

Sub Macro1()
Dim CD As Workbook 'déclare la variable CD (Claseur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim CA As String 'déclare la variable CA (Chemin d'Accès)
Dim F As String 'déclare la variable F (Fichiers)
Dim DR As Long 'déclare la variable DR (Date de Référence)
Dim DM As Long 'déclare la variable DM (Date Maximum)
Dim CS As Workbook 'déclare la variable CS (Claseur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim DL As Long 'déclare la variable DL (Dernière Ligne)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set CD = ThisWorkbook 'définit le classeur destination CD
Set OD = CD.Sheets("Feuil1") 'définit l'onglet destination OD
CA = CD.Path & "\" 'définit le chemin d'accès CA
OD.Range("A4:AH" & Application.Rows.Count).Clear 'supprime d'éventuelles ancienne données dans l'onglet OD
DR = 0 'Intitalise la date de référence DR
F = Dir(CA & "*.xlsx") 'définit le premier fichier F avec l'extension ".xlsx" dans le dossier CA
Do While F <> "" 'exécute tant qu'il existe des fichiers F
    'si les 8 premiers caractères (convertis en entier long) du nom di fichier F sont supérieur à DM, DM devient cet entier long
    If CLng(Left(F, 8)) > DR Then DM = CLng(Left(F, 8))
    F = Dir 'fichier suivant, avec l'extension ".xlsx" dans le dossier CA
Loop 'boucle
F = Dir(CA & CStr(DM) & "*.xlsx") 'définit le premier fichier F commençant par DM, avec l'extension ".xlsx" dans le dossier CA
Do While F <> "" 'exécute tant qu'il existe des fichiers F
    Application.Workbooks.Open (F) 'ouvre le fichier F
    Set CS = ActiveWorkbook 'définit le classeur source CS
    Set OS = CS.Sheets("Suivi") 'définit l'onglet source OS
    'définit la cellule de destination DEST (A4, si A4 est vide, sinon, la première cellule vide de la colonne A de l'onglet OD)
    Set DEST = IIf(OD.Range("A4").Value = "", OD.Range("A4"), OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(1, 0))
    DL = OS.Cells(Application.Rows.Count, "A").End(xlUp).Row 'dédinit la dernière ligne éditée de la colonne A de l'onglet OS
    OS.Range("A5:AG" & DL).Copy 'copie la plage A5:AG...(DL)
    DEST.PasteSpecial (xlPasteValuesAndNumberFormats) 'renvoie dans DEST les valeurs et les formats de nombre de la plage copiée
    DEST.Offset(0, 33).Value = OS.Range("a1").Value 'récupère le nom de 'longlet source
    CS.Close SaveChanges = False 'ferme le fichier source sans enregister les changements
    F = Dir 'fichier suivant commençant par DM avec l'extension ".xlsx" dans le dossier CA
Loop 'boucle
OD.Range("A3").Select 'sélectionne la cellule A3 de l'onglet OD
CD.Save 'enregistre le fichier destination
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
MsgBox "Fin du traitement des données !" 'message
End Sub

Le fichier :

2'432fichier-glogabl.xlsm (25.58 Ko)

Hey ! Merci pour ta réponse. J'ai réussi à faire ce que je voulais en prenant les infos à droite et à gauche.

Merci beaucoup pour ton aide !

Rechercher des sujets similaires à "creation macro aller chercher info classeur"