Somme de plusieurs classeurs fermés
Bonjour,
J'aimerais créer une macro pour sommer des cellules de plusieurs classeurs excel fermés.
Je m'explique...
Dans un répertoire, j'ai 50 classeurs identiques nommés : Entité1.xls, Entité2.xls, etc.
Chaque classeur possède 20 onglets identiques nommés : Onglet1, Onglet2, etc.
Chaque onglet possède un tableau de nombre avec 100 colonnes et 200 lignes (plage continue)
Chaque classeur fait 25Mo (les 20 onglets alimentent 150 autres onglets). Sur mon PC il faut 50s pour qu'un classeur s'ouvre. Je ne peux pas ouvrir les 50 classeurs en meme temps.
Je souhaite constituer un classeur Recap.xls identique aux classeurs EntitéX.xls, avec 20 onglets faisant la somme de chaque cellule de chaque OngletX de chaque classeur.
Ce classeur Recap.xls devra être actualisé une fois par trimestre.
Le nombre de classeur EntitéX.xls peut être différent d'un trimestre sur l'autre.
Le nombre d'onglet OngletX peut être différent d'un trimestre sur l'autre.
Voilà, c'est tout simple en soit mais avec la volumétrie et mon PC pourri ça complique pas mal les choses...
Je ne sais pas si j'ai été suffisamment claire alors je vous joins un exemple simplifié avec 2 classeurs, 2 onglets, 2 colonnes et 2 lignes.
J'ai cherché sur le forum, j'ai fait des tests mais je n'ai pas réussi... alors je fais appel à vous !
Ah oui j'allais oublier... Je travaille sur excel 2003 FR et je ne me débrouille pas très bien sur vba...
Merci beaucoup par avance !
Bonjour,
Un lien qui pourrait être intéressant pour tes besoins.
Cdlt
https://forum.excel-pratique.com/excel/extraction-donnees-sur-plusieurs-classeurs-fermes-t34229.html
Bonjour Jean-Eric,
Merci pour le lien mais j'avais vu ce post et j'ai tenté d'adapter la macro mais plusieurs problèmes :
1/la macro ne fait pas de somme des cellules mais va simplement chercher une cellule
2/on peut sélectionner la première ligne mais pas la première colonne
3/elle va chercher des cellules et pas une plage de données
4/elle ne marche que pour 1 onglet...
Voici la macro utilisée :
Sub Creer_Recapitulatif()
Dim Obj, RepP, Fichier, F1
Dim i As Integer, Lig As Long
Dim Chemin As String
Dim WksDest As Worksheet
Dim wlSource As Worksheet
Dim TB
Application.ScreenUpdating = False
TB = Array(" ", "c3")
Chemin = "C:\Documents and Settings\Bureau\TEST" 'Adapter le répertoire
Set WksDest = ThisWorkbook.Sheets("Onglet1") 'feuille de destination
Lig = WksDest.Cells(Rows.Count, 1).End(xlUp).Row + 2 '1ère ligne où commencer les transferts
Set Obj = CreateObject("Scripting.FileSystemObject")
Set RepP = Obj.GetFolder(Chemin)
Set Fichier = RepP.Files
For Each F1 In Fichier 'boucle sur tous les fichiers du répertoire
If F1 Like "C:\Documents and Settings\Bureau\TEST\Ent*" Then
Workbooks.Open F1
'Le fichier qu'on vient d'ouvrir est toujours le fichier actif
With ActiveWorkbook.Sheets(1) 'Travail avec l'index feuille et pas le nom
For i = 1 To UBound(TB)
WksDest.Cells(Lig, i) = .Range(TB(i))
Next i
'Copie pour avoir aussi le format
.Range("c3").Copy WksDest.Cells(Lig, i)
'Ferme le classeur sans sauver et sans message.
ActiveWorkbook.Close False
Lig = Lig + 1
End With
End If
Next F1
Set RepP = Nothing
Set Obj = Nothing
End Sub
Bon, j'ai ajouté une condition sur la colonne et sur les onglets, ça semble marcher. Mais j'ai toujours des problèmes pour la somme et la plage de données...
Macro modifiée :
Sub Creer_Recapitulatif()
Dim Obj, RepP, Fichier, F1
Dim i, j As Integer, Lig As Long
Dim Chemin As String
Dim WksDest As Worksheet
Dim wlSource As Worksheet
Dim TB
For j = 1 To 2
Application.ScreenUpdating = False
TB = Array(" ", "c3")
Chemin = "C:\Documents and Settings\Bureau\TEST" 'Adapter le répertoire
Set WksDest = ThisWorkbook.Sheets("Onglet" & j) 'feuille de destination
Lig = WksDest.Cells(Rows.Count, 1).End(xlUp).Row + 2 '1ère ligne où commencer les transferts
Set Obj = CreateObject("Scripting.FileSystemObject")
Set RepP = Obj.GetFolder(Chemin)
Set Fichier = RepP.Files
For Each F1 In Fichier 'boucle sur tous les fichiers du répertoire
If F1 Like "C:\Documents and Settings\Bureau\TEST\Ent*" Then
Workbooks.Open F1
'Le fichier qu'on vient d'ouvrir est toujours le fichier actif
With ActiveWorkbook.Sheets(1) 'Travail avec l'index feuille et pas le nom
For i = 3 To UBound(TB)
WksDest.Cells(Lig, i) = .Range(TB(i))
Next i
'Copie pour avoir aussi le format
.Range("c3").Copy WksDest.Cells(Lig, i)
'Ferme le classeur sans sauver et sans message.
ActiveWorkbook.Close False
Lig = Lig + 1
End With
End If
Next F1
Next j
Set RepP = Nothing
Set Obj = Nothing
End Sub
Pour information, j'ai trouvé la solution cf. fichier joint