Macro pour récupérer des données dans plusieurs classeurs

Bonjour,

Je sollicite votre aide pour écrire une macro qui vient ouvrir différents fichiers dans un emplacement spécifique avec la même structure pour copier les données et ainsi générer une BDD.

Mon fichier TEST est copié sur le bureau et est composé de 2 classeurs.

Pour chaque classeur on retrouve les mêmes informations. En B1 le client, en B8 la commande et en D8 la date.

J’aimerai que dans le classeur macro (c’est dans ce classeur qu’il y a ma macro) le client apparaisse en A3, la commande en B3 et la date en C3 pour me créer une BDD sans que j’ai à ouvrir tous les classeur (en réalité j’en ai des centaines, j’en ai mis deux pour l’exemple).

Classeur1.xlsx (7,9 Ko) Classeur2.xlsx (9,1 Ko) macro.xlsm (21,6 Ko)

Voici ma macro qui ne fonctionne pas :

Sub listerLesFichiers()
Application.ScreenUpdating = False
Dim chemin As String, Fichier As String

’ On a besoin du chemin absolu du dossier
’ Doit se terminer par
chemin = « CHEMIN »

’ La fonction Dir(chemin, mode) permet de parcourir un dossier
’ Ici je rajoute à mon chemin « *.xlsx »,
’ pour ne retrouver que mes fichiers Excel
’ vbNormal permet de ne récupérer que des fichiers,
’ vbDirectory récupère tout (dossiers et fichiers)
Fichier = Dir(chemin & « .xlsx », vbNormal)
’ boucle pour ouvrir tous les fichiers un à un
Do While Fichier <> «  »

With Workbooks.Open(chemin & Fichier)
.Activate

DerLigneVide = Workbooks("macro.xlsm").Sheets("Feuil1").Range("A3").End(xlDown).Row + 1
Workbooks("macro.xlsm").Sheets("Feuil1").Cells(DerLigneVide, 1) = ActiveWorkbook.Sheets("Feuil1").Range("B1")

  DerLigneVide1 = Workbooks("macro.xlsm").Sheets("Feuil1").Range("B3").End(xlDown).Row + 1
Workbooks("macro.xlsm").Sheets("Feuil1").Cells(DerLigneVide1, 1) = ActiveWorkbook.Sheets("Feuil1").Range("B8")
DerLigneVide = Workbooks("macro.xlsm").Sheets("Feuil1").Range("C3").End(xlDown).Row + 1
   Workbooks("macro.xlsm").Sheets("Feuil1").Cells(DerLigneVide, 1) = ActiveWorkbook.Sheets("Feuil1").Range("D8")

End With

Fichier = Dir
Loop

Call FermerTousClasseurs
Application.ScreenUpdating = True
End Sub

Sub FermerTousClasseurs()

Application.DisplayAlerts = False

Dim Classeur As Workbook
For Each Classeur In Workbooks
If Classeur.Name <> ThisWorkbook.Name Then
Classeur.Close SaveChanges:=False
End If
Next Classeur

Application.DisplayAlerts = True

End Sub

Merci pour votre aide,

Bonne journée,

Bonjour

Mes ces lignes de codes à la place de celles de ta copie :

DerLigneVide = Workbooks(« macro.xlsm »).Sheets(« Feuil1 »).Range(« A » & Rows.Count).End(xlUp).Row + 1
Workbooks(« macro.xlsm »).Sheets(« Feuil1 »).Cells(DerLigneVide, 1) = ActiveWorkbook.Sheets(« Feuil1 »).Range(« B1 »)

  DerLigneVide = Workbooks("macro.xlsm").Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row + 1
Workbooks("macro.xlsm").Sheets("Feuil1").Cells(DerLigneVide, 1) = ActiveWorkbook.Sheets("Feuil1").Range("B8")
DerLigneVide = Workbooks("macro.xlsm").Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row + 1
   Workbooks("macro.xlsm").Sheets("Feuil1").Cells(DerLigneVide, 1) = ActiveWorkbook.Sheets("Feuil1").Range("D8"

ainsi :

J’ai testé pour moi cela fonctionne

Bonjour FFO,

Merci pour ton retour. J’ai corrigé mais de mon coté la macro ne fonctionne toujours pas…

Sub listerLesFichiers()

Application.ScreenUpdating = False

Dim chemin As String, Fichier As String

chemin = « Z:\COLLABORATEURS\Coralie\TEST »
Fichier = Dir(chemin & « .xlsx », vbNormal)

Do While Fichier <> «  »

With Workbooks.Open(chemin & Fichier)
.Activate

DerLigneVide = Workbooks("macro.xlsm").Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row + 1
Workbooks("macro.xlsm").Sheets("Feuil1").Cells(DerLigneVide, 1) = ActiveWorkbook.Sheets("Feuil1").Range("B1")

 DerLigneVide = Workbooks("macro.xlsm").Sheets("Feuil1").Range("B" & Rows.Count).End(xlUp).Row + 1
Workbooks("macro.xlsm").Sheets("Feuil1").Cells(DerLigneVide, 1) = ActiveWorkbook.Sheets("Feuil1").Range("B8")

 DerLigneVide = Workbooks("macro.xlsm").Sheets("Feuil1").Range("C" & Rows.Count).End(xlUp).Row + 1
Workbooks("macro.xlsm").Sheets("Feuil1").Cells(DerLigneVide, 1) = ActiveWorkbook.Sheets("Feuil1").Range("D8")

End With

Fichier = Dir
Loop

Call FermerTousClasseurs

Application.ScreenUpdating = True

End Sub

Sub FermerTousClasseurs()

Application.DisplayAlerts = False

Dim Classeur As Workbook
For Each Classeur In Workbooks
If Classeur.Name <> ThisWorkbook.Name Then
Classeur.Close SaveChanges:=False
End If
Next Classeur

Application.DisplayAlerts = True

End Sub

Mon objectif est d’avoir une BDD avec les noms des clients en colonne A, le numéro de commande en colonne B et la date en colonne C de la feuil1 du classeur macro.

Ton fichier corrigé qui fonctionne tests à l’appui

une petite coquille qui m’avait échappée sur cette ligne de code :

Fichier = Dir(chemin & « .xlsx », vbNormal)

il faut mettre comme ceci :

Fichier = Dir(chemin & « *.xlsx », vbNormal)

Manque le caractère « * » devant .xlsx

Testes et dis moi

macro.xlsm (22,6 Ko)

J’ai ajouté l’* et en passant en commentaires la macro pour fermer les classeurs je me rend compte que la macro arrive à ouvrir les deux classeurs (classeur1 et classeur2) donc cela fonctionne.

Mais pour autant les données ne viennent pas alimenter la BDD…

Je te joins un exemple de ce que je veux.

image

macro.xlsm (24,5 Ko)

Je ne trouve pas ces entêtes dans ton fichier
Où sont elles ?
Qu’appelles tu BDD
Les données sont rapportées conformément au code ainsi :

image

dans le fichier « macro.xlsm » onglet « Feuil1 »

Si ce n’est pas ce que tu espères merci de me dire où ils doivent se retrouver après traitement (classeur/onglet/cellule)

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.