Consolider plusieurs feuilles simultanément [Partie 2]
Résoluhmcirta Messages postés 249 Date d'inscription Statut Membre Dernière intervention -
Mon sujet de même titre n'ayant inspiré personne a été fermé, je n'ai donc pas trouvé un autre moyen que de recréer un autre poste qui sera la suite du premier.Voici le lien du poste pour rappeler la question.
http://www.commentcamarche.net/forum/affich-31911493-consolider-plusieurs-feuilles-simultanement#p32318161
J'ai voulu rouvrir le sujet car je suis arrivé à une solution qui n'est sans doute pas la meilleure ni la plus pratique, mais ça a l'air de faire l'affaire. S'il y en a qui peuvent proposer mieux je suis bien sur preneur (et je voudrais bien qu'il y en ait).
Comme passer par "Données\Consolider" était une impasse je suis passé aux macros en utilisant la méthode
Range.Consolidate Sources:=Array(Source), Function:=xlSum, TopRow:=True, LeftColumn:=True, CreateLinks:=False
Voici le code que j'ai fait (bien sur j'ai enregistré une macro que j'ai modifié ensuite, je ne fais que mes débuts en VBA).
Sub Consolide7Feuilles()
'
'
Feuil4.Activate
Range("A1").Select
Arg1 = Range("A13").Value
Arg2 = Range("A14").Value
Arg3 = Range("A15").Value
Arg4 = Range("A16").Value
Arg5 = Range("A17").Value
Arg6 = Range("A18").Value
Arg7 = Range("A19").Value
'
Sheets("Consolidation").Select
Range("A1").Select
Selection.Consolidate Sources:=Array(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7), _
Function:=xlSum, TopRow:=True, LeftColumn _
:=True, CreateLinks:=False
End Sub
Ce n'est pas grand-chose mais ça marche pour me faire gagner du temps, sur tout que j'ai plusieurs fichiers de ~70 à ~200 feuilles chacun.
Je reste ouvert a toutes vos propositions d’amélioration
15 réponses
La problématique porte sur la consolidation de données de plusieurs classeurs Excel en une seule feuille via VBA, en utilisant Range.Consolidate et un tableau de sources. Les échanges mettent en avant l'emploi de Sources:=Array(...) avec des chaînes complètes de référence, et les erreurs fréquentes comme 1004 ou 9 liées au chemin, à la syntaxe et aux séparateurs. D'autres propositions montrent comment éviter la sélection active, construire un ContenuSrc ou des tableaux dynamiques, et donner des exemples concrets de formules utilisant D:\Docs de Travail\[DMR2325.xlsx]DDFR05!R12C13:R67C20. Les contributions indiquent aussi qu'un nombre d'arguments variable pour Array peut faciliter le traitement de plusieurs feuilles et s'adapter facilement à une consolidation incluant sept feuilles ou davantage.
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
bonsoir, je te suggère:
1) ajouter option explicit en début de module, et donc déclarer toutes tes variables.
2) ne pas utiliser activate et select, donc:Arg1 = Feuil4.Range("A13").Value Arg2 = Feuil4.Range("A14").Value Arg3 = Feuil4.Range("A15").Value Arg4 = Feuil4.Range("A16").Value Arg5 = Feuil4.Range("A17").Value Arg6 = Feuil4.Range("A18").Value Arg7 = Feuil4.Range("A19").Value ' Sheets("Consolidation").Range("A1").Consolidate ' etc... -
J'ai encore une petite question.
Est-ce qu'il y a un moyen pour que le nombre d'arguments de:
Sources:=Array(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)
soit variable ? C'est a dire que je pourrai choisir le nombre de feuilles a consolider, (dans ce cas 7 feuilles sont consolidées)-
-
Merci yg_be pour ta reponse.
Est-ce que je peux faire quelque chose comme ca :
dim src as variant dim Nb as integer Nb=Feuil4.Range("B1").Value ' Attribuer a Nb le nombre max de feuilles a consolider redim src (1 to Nb) Dim t as Integer For t =1 to Nb src(t)=Feuil4.cells(Nb.14).Value ' Avec les noms des feuilles listés dans la colonne N1:NX ou X est variable Next i '... Sources:=src -
-
-
j'ai testé avec 3 feuilles seulement et j’obtiens le message suivant:
Erreur d’exécution '1004'
La méthode Consolidate de la classe Range a échoué.
avec :Selection.Consolidate Sources:=src, Function:=xlSum, TopRow:=True, LeftColumn _ :=True, CreateLinks:=False
en surbrillance.
Voici la modification effectuée
Sub Consolide7Feuilles() ' RecupNomFeuilles ' ' Feuil4.Activate Range("A1").Select Plage = Range("D5").Value Set mc = Range(Plage) Range("E5").Value = mc.Address(ReferenceStyle:=xlR1C1) Dim src As Variant Dim Nb As Integer Nb = Feuil4.Range("B1").Value ' Attribuer a Nb le nombre max de feuilles a consolider ReDim src(1 To Nb) Dim t As Integer For t = 1 To Nb src(t) = Feuil4.Cells(t, 14).Value ' Avec les noms des feuilles listés dans la colonne N1:NX ou X est variable Next t '... Selection.Consolidate Sources:=src, Function:=xlSum, TopRow:=True, LeftColumn _ :=True, CreateLinks:=False ' Sources:=src End Sub
et;
Sub RecupNomFeuilles() ' Recuperer les noms de 7 feilles du classeur dans des cellules Dim i As Integer Dim FileDMR As String Dim FileCon As String Dim Sh As String Workbooks("Consolidation-Test.xlsm").Activate Feuil4.Select FileCon = Range("A1").Value FileDMR = Range("B4").Value Sh = Range("B11").Value 'Workbooks.Open (FileDMR) Workbooks(FileDMR).Activate Sheets(Sh).Select 'Workbooks(FileCon).Activate F = Excel.ActiveSheet.Index j = 5 For i = F - 6 To F Workbooks(FileDMR).Activate Nom = Sheets(i).Name Workbooks("Consolidation-Test.xlsm").Activate Feuil4.Select Cells(j, 2).Value = Nom j = j + 1 'Next j Next i End Sub
Le 2eme code ne récupère que les noms de 7 feuilles, il sera modifié de sorte qu'il récupère les noms de toutes les feuilles a consolider du 2eme classeur et qui seront mis dans une liste de choix.
Je sais ça se complique un peu, mais c'est ce que je voudrais bien obtenir
-
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
essayons d'éliminer selection:Sheets("Consolidation").Range("A1").Consolidate
et c'était bien cstr:ContenuSrc = ContenuSrc & "|" & cstr(t) & ":" & src(t)
-
Bonjour,
Voici la modification effectuée
For t = 1 To Nb src(t) = Feuil4.Cells(t, 14).Value ' Avec les noms des feuilles listés dans la colonne N1:NX ou X est variable ContenuSrc = ContenuSrc & "|" & CStr(t) & ":" & src(t) Next t MsgBox ContenuSrc Range("A24") = ContenuSrc Sheets("consolidate").Range("A1").Consolidate Sources:=src, Function:=xlSum, _ TopRow:=True, LeftColumn:=True, CreateLinks:=False
Cette fois-ci la Msgbox me retourne ceci
|1:DDFR01|2:DDFR02|3:DDFR03|4:DDFR04|5:DDFR05
Mais ça débogue toujours sur la dernière ligne :( -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
C'est toujours Erreur 1004
Arg1 contenait ceci
Chemin\[Nom Du Fichier ou sont les données à consolider.Extension du fichier (xls ou xlsx)]Nom de La feuille t!PlageAConsolider
Exemple:
Arg1 contient D:\Docs de Travail\[DMR2325.xlsx]DDFR13!R12C13:R67C20
Sur la feuille Feuil4 du fichier Consolidation-Test.xlsm- le chemin est saisie dans la cellule B3
- le nom du fichier est saisie avec son extension dans la cellule B4
- le nom de la feuille t où sont les données est saisie dans la cellule B5 à B11 (pour Arg1 à Arg7)
-
donc, quand tout fonctionnait, tu appelais "consolidate" avec "D:\Docs de Travail\[DMR2325.xlsx]DDFR13!R12C13:R67C20".
et maintenant tu appelles avec simplement le nom de la feuille. cela me semble donc normal que cela ne fonctionne plus.
peut-être ainsi, si jamais seul le nom de la feuille change pour chacun des arguments?src(t) = "D:\Docs de Travail\[DMR2325.xlsx]" & Feuil4.Cells(t, 14).Value & "!R12C13:R67C20"
-
Vraiment merci yg_be de ta patience.
avecSelection.Consolidate Sources:=Array(ContenuSrc), _ Function:=xlSum, TopRow:=True, LeftColumn:=True, CreateLinks:=False
ça donne Erreur 13
et avecSelection.Consolidate Sources:=Array(ContenuSrc), _ Function:=xlSum, TopRow:=True, LeftColumn:=True, CreateLinks:=False
ça donne Erreur 9 -
Non plus
A mon avis si on arrive a automatiser l'ajout des Arg1, Arg2, ... ,Argt on obtiendra un bon résultat.
Qu'en penses-tu ? -
Erreur 9
ContenuSrc contient
D:\Docs de Travail\[DMR2325.xlsx]DDFR05!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR04!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR03!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR02!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR01!R12C13:R67C20,
Il y a une virgule et un espace de trop je pense.
j'ai même essayé avec ça mais ça n'a rien donné
Sheets("consolidate").Range("A1").Consolidate Sources:=Array(D:\Docs de Travail\[DMR2325.xlsx]DDFR05!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR04!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR03!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR02!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR01!R12C13:R67C20), Function:=xlSum, _ TopRow:=True, LeftColumn:=True, CreateLinks:=False
Le message d'erreur dit :
Erreur de compilation
Attendu : séparateur de liste ou )
et les ':' de 'D:\ .... ' sont en surbrillance
NB : Toutes les lignes ici sauf la dernière sont sur la même ligne dans le code-
je pense que tu as fais trop de changements dans le code: peux-tu montrer le code?
bonne idée, mais:Sheets("consolidate").Range("A1").Consolidate Sources:=Array("D:\Docs de Travail\[DMR2325.xlsx]DDFR05!R12C13:R67C20", "D:\Docs de Travail\[DMR2325.xlsx]DDFR04!R12C13:R67C20", "D:\Docs de Travail\[DMR2325.xlsx]DDFR03!R12C13:R67C20", "D:\Docs de Travail\[DMR2325.xlsx]DDFR02!R12C13:R67C20", "D:\Docs de Travail\[DMR2325.xlsx]DDFR01!R12C13:R67C20"), Function:=xlSum, _ TopRow:=True, LeftColumn:=True, CreateLinks:=False
-
-
C'est justement ce que j'allais proposer :)
Option Explicit Sub ConsolidetFeuilles() ' '******************************************************* 'Declaration des variables Dim Plage As String Dim mc As Range Dim src As Variant Dim Nb As Integer Dim t As Integer Dim ContenuSrc As String '******************************************************* 'Verifier si liste des noms sur la colonne N est rempli et evite l'execution de _la Sub "RecupNomFeuilles" si c'est le cas. If Feuil4.Range("N1").Value <> "" Then GoTo 10 RecupNomFeuilles 10 '******************************************************* ' '''''''Sheets("Feuil4").Range("A1").Select Plage = Range("D5").Value Set mc = Range(Plage) Range("E5").Value = mc.Address(ReferenceStyle:=xlR1C1) Nb = Feuil4.Range("B1").Value ' Attribuer a Nb le nombre max de feuilles a consolider ReDim src(1 To Nb) '******************************************************* 'Le code For t = 1 To Nb src(t) = "D:\Docs de Travail\[DMR2325.xlsx]" & Feuil4.Cells(t, 14).Value & "!R12C13:R67C20" ' src(t) = Feuil4.Cells(t, 14).Value ' Avec les noms des feuilles listés dans la colonne N1:NX ou X est variable ' ContenuSrc = ContenuSrc & "|" & CStr(t) & ":" & src(t) ContenuSrc = src(t) & ", " & ContenuSrc Next t MsgBox ContenuSrc Range("A24") = ContenuSrc ' Selection.Consolidate Sources:=Array(ContenuSrc), _ Function:=xlSum, TopRow:=True, LeftColumn:=True, CreateLinks:=False Sheets("consolidate").Range("A1").Consolidate Sources:=src, Function:=xlSum, _ TopRow:=True, LeftColumn:=True, CreateLinks:=False ' Sheets("consolidate").Range("A1").Consolidate Sources:=Array(D:\Docs de Travail\[DMR2325.xlsx]DDFR05!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR04!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR03!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR02!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR01!R12C13:R67C20), Function:=xlSum, _ TopRow:=True, LeftColumn:=True, CreateLinks:=False End Sub
j'ai fait un peu de rangement X) -
Bonjour,
En effet et apres correction j'ai 5 messages comme ceci
Impossible d'ouvrir le fichier source de consolidation '[DMR2325.xlsx]DDFR01
...
Impossible d'ouvrir le fichier source de consolidation '[DMR2325.xlsx]DDFR05
-
La même chose que précédemment
D:\Docs de Travail\[DMR2325.xlsx]DDFR05!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR04!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR03!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR02!R12C13:R67C20, D:\Docs de Travail\[DMR2325.xlsx]DDFR01!R12C13:R67C20,
NB : il y a un espace après la virgule.-
et ainsi?
src(t) = "'D:\Docs de Travail\[DMR2325.xlsx]" & Feuil4.Cells(t, 14).Value & "'!R12C13:R67C20"
- Toujours pareil avec une apostrophe au début
'D:\Docs de Travail\[DMR2325.xlsx]DDFR05'!R12C13:R67C20, 'D:\Docs de Travail\[DMR2325.xlsx]DDFR04'!R12C13:R67C20, 'D:\Docs de Travail\[DMR2325.xlsx]DDFR03'!R12C13:R67C20, 'D:\Docs de Travail\[DMR2325.xlsx]DDFR02'!R12C13:R67C20, 'D:\Docs de Travail\[DMR2325.xlsx]DDFR01'!R12C13:R67C20,
-
- Je pense qu'il n'existe pas de solution :'(
J'ai essayé aussi pas mal de trucs sans succès
Il ne me reste plus qu'a consolider par paquets de 7 feuilles et créer un autre fichier pour consolider 30 ou 31 feuilles.
Un grand merci a toi yg_be pour le temps et la patience que tu m'as consacré.
J'attendrai encore un peu s'il y aura quelqu'un d'autre pour m'aider, sinon un admin pourra fermer le sujet.
-
-
Ça n'inspire personne a ce que je vois :(.
Mon problème restera t-il sans solution ? -
Un petit UP car je coince toujours
-
Ce qui attire mon attention c'est que le "Array" de la ligne :
Selection.Consolidate Sources:=Array(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7)
n'est pas déclare.
Est-ce un tableau unidimensionnel ou est-ce autre chose ? -
je vais surement dire des bêtises, mais bon ...
Est-ce que l'utilisation de ForEach peut résoudre le problème ? :P
peut-on exploiter ce code ?
Private Sub Constant_demo_Click() Dim arr(5) arr(0) = "1" 'Number as String arr(1) = "VBScript" 'String arr(2) = 100 'Number arr(3) = 2.45 'Decimal Number arr(4) = #10/07/2013# 'Date arr(5) = #12.45 PM# 'Time msgbox("Value stored in Array index 0 : " & arr(0)) msgbox("Value stored in Array index 1 : " & arr(1)) msgbox("Value stored in Array index 2 : " & arr(2)) msgbox("Value stored in Array index 3 : " & arr(3)) msgbox("Value stored in Array index 4 : " & arr(4)) msgbox("Value stored in Array index 5 : " & arr(5)) End Sub