Macro solution + simple ?
Bonjour à tous !
Jaimerais avoir vos avis sur un problème :
J'ai 3 classeurs : classeur 1, 2, et 3
Dans un classeur 4, je veux recopier le contenue de tous les onglets de ces autres classeurs sur une feuil unique de mon classeur 4.
Le problème est que cette 3 autres classeurs auront un nombres indéfini d'onglets avec des noms différents que je ne connais pas (je ne peux absolument pas avoir d'emprise la dessus), il me faut donc une facon de recopier ce contenu sur ma feuille, et ce quelque soit le nombre d'onglets des classeur (qui eux auront un nom définis ).
Merci pour votre aide !!
James
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonjour à tous,
En résumé, tu veux faire une seule grosse base de données regroupant les
onglets de 3 classeurs, c'est bien çà ?
Questions :
1) ces onglets ont-ils la même structure ?
2) cette opération sera-elle répétitive ?
3) l'ensemble fera combien de lignes ? (environ, fourchette)
peux-tu envoyer un onglet type (seulement quelques lignes)
à te relire
Amicalement
Claude
Bonjour Caude et merci pour la réponse
En résumé, tu veux faire une seule grosse base de données regroupant les
onglets de 3 classeurs, c'est bien çà ?
Oui et le tout sur un onglet unique: cet onglet contiendra le contenu de tous les autres onglet du range A7 au U200
1) ces onglets ont-ils la même structure ? Non, il y a 4 structure types, mais par la suite je les masquerai à l'aide de macro (j'ai déjà la méthode pour faire cela)
2) cette opération sera-elle répétitive ? On part pour une mise a jour des fichiers 1 fois par mois
3) l'ensemble fera combien de lignes ? (environ, fourchette) Beaucoup, je pense atteindre les 10 000 lignes (en copiant 200 ligne par onglet comme indiquer en haut.
peux-tu envoyer un onglet type (seulement quelques lignes). Je ne pense pas que ca soir nécessaire avec toutes les informations que je viens de donner, et les informations sont confidentielles. (rien de spécial dans ce que je veux copier, les cellules ont des format de validation pour la plupart ou du texte, et les cellules fusionnées sont déja gerée par macro).
Merci pour l'interressement,
James
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
Autre question,
Sur chaque classeur, il doit y avoir des onglets à ne pas rapatrier,
si c'est le cas, il faudrait les placer en 1er de sorte à récupérer les feuilles à partir de la 3ème (par exemple)
jusqu'à la dernière.(au besoin ajouter des feuilles vierges au début) pour démarrer toujours à la 3ème,
précise ce point
Les 4 classeurs seront-ils dans le même répertoire ?
Claude
Impossible, les onglet seront mélanger au moment de les rapatrier, il n'est pas envisageable de changer lordre des onglets pour chaque fichier, cela représenterait un travail trop gros !
Pour le moment je pense que la meilleure solution est de tous les rapatrier et de les trier apres (facile ceux que je veux garder ont forcement queque chose d'écrit dans la colonne K et pas les autres ...)
j'ai tenté la macro :
Sub mo()
Dim Wb As Workbook
Dim Ws As Worksheet
Dim cell As Range
For Each Wb In Application.Workbooks
For Each Ws In Wb.Worksheets
Range("A7:U200").Copy Windows("synthèse").Sheets("Feuil3").Range("A65536").End(xlUp).Offset(1, 0)
Next Ws
Next Wb
End Sub
Mais ca me met erreur d'execution 438, et impossible de savoir pourquoi...
Je suis preneur de correction ou d'autres solutions !!
Merci CLaude,
James
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
un début,
macro à placer dans "synthèse.xls" mais à lancer à partir du fichier à copier
restera à boucler pour les 3 classeurs
Sub MaBase()
Dim Lg%, i%
'Macros par Claude Dubois pour "james404" Excel-Pratique le 04 Mai 10
Application.ScreenUpdating = False
For i = 1 To Worksheets.Count
With Worksheets(i)
If Application.CountA(.Range("k:k")) > 1 Then 'feuille à copier
Lg = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
.Range("A7:U" & Lg).Copy Destination:=Workbooks("synthèse.xls") _
.Sheets("Feuil3").Range("A65536").End(xlUp)(2)
End If
End With
Next i
End Subvérifie la destination
Amicalement
Claude
Ok pour ta macro, mais avec cela, je ne fais pas le tour des classseurs ouverts, en bouclant la boucle et avec un peu d'aide, on arrive à obtenir ca qui fonctionne en prenant en compte les classeurs ouverts ce qui me semblent très pratiques pour la suite :
Dim Wb As Workbook
Dim Ws As Worksheet
Dim cell As Range
For Each Wb In Application.Workbooks
Wb.Activate
For Each Ws In Wb.Worksheets
Ws.Activate
Range("A7:U200").Copy Workbooks("synthèse").Sheets("Feuil3").Range("A35536").End(xlUp).Offset(1, 0)
Next Ws
Next Wb
L e problème est maintenant (comme tu la dis ce matin), que ce que j'obtiens ne me convient pas car trop long et la macro permettant d'enlever les lignes en trop n'est pas au top. je pense donc qu'en choisissant mes feuille a copier, je gagnerai du temps !
Le pb : je ne connais pas le nom des feuiil donc impossible de passer par la . Etant donné que je diffuserai l'outil, je pensais à eventuellement mettre un espion dans mes feuilles concernées, et lorsque celle ci me reviendront espion sera tjrs présent et la macroo fonctionnera! pb comment faire ca?
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
re,
là, je teste déjà la colonne "K" comme tu disais, peut-être à régler
maintenant tu n'as que 3 classeurs et ce une fois par mois, c'est pas le bout du monde
SI en faite !! parcqu'une fois l'outil lancé, ce ne sera plus moi qui m'occuperai de ca, donc il faut que ce soit le + simple possible
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonsoir,
tu peux mettre un bouton sur une feuille du fichier "synthèse"
Sub MaBase()
Dim Lg%, i%, Wbk$, W As Workbook
'Macros par Claude Dubois pour "james404" Excel-Pratique le 04 Mai 10
Application.ScreenUpdating = False
Wbk = ActiveWorkbook.Name
For Each W In Workbooks
If W.Name <> Wbk Then
W.Activate
For i = 1 To Worksheets.Count
With Worksheets(i)
If Application.CountA(.Range("k:k")) > 1 Then 'feuille à copier
Lg = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
.Range("A7:U" & Lg).Copy Destination:=Workbooks(Wbk) _
.Sheets("Feuil3").Range("A65536").End(xlUp)(2)
End If
End With
Next i
End If
Next W
Workbooks(Wbk).Sheets("Feuil3").Activate
End Subédit: éviter d'ouvrir d'autres fichiers que ceux concernés
édit2: 23:45
Le code précédent risque d'écraser des lignes si la colonne "A" n'est pas complètement remplie,
prends plutôt cette macro qui en + sépare les feuilles par une ligne jaune avec le nom du fichier et des feuilles
elle ajoute une feuille nommée "bibi"
Sub RécupFeuilles()
Dim Lg%, Lg2%, i%, Wbk$, W As Workbook
'Macros par Claude Dubois pour "james404" Excel-Pratique le 04 Mai 10
Application.ScreenUpdating = False
Wbk = ActiveWorkbook.Name
On Error Resume Next
Application.DisplayAlerts = False
Sheets("bibi").Delete
Application.DisplayAlerts = True
On Error GoTo 0
Sheets.Add after:=Sheets(2)
ActiveSheet.Name = "bibi"
Sheets("bibi").Cells(1, 1) = "Récupération Feuilles" 'obligatoire pour la suite
For Each W In Workbooks
If W.Name <> Wbk Then
W.Activate
For i = 1 To Worksheets.Count
With Worksheets(i)
If Application.CountA(.Range("k:k")) > 1 Then 'feuille à copier
'---- pour assurer si la colonne A n'est pas remplie complètement ,
'---- + identifie et sépare les feuilles par une ligne jaune ----
With Workbooks(Wbk).Sheets("bibi")
Lg2 = .Cells.Find("*", , , , xlByRows, xlPrevious).Row + 1
.Cells(Lg2, 1) = W.Name & " - " & Worksheets(i).Name
.Rows(Lg2).Interior.ColorIndex = 6
End With
'----
Lg = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
.Range("A7:U" & Lg).Copy Destination:=Workbooks(Wbk) _
.Sheets("bibi").Range("A65536").End(xlUp)(2)
End If
End With
Next i
End If
Next W
Workbooks(Wbk).Sheets("bibi").Activate
End SubAmicalement
Claude
!!!!!!!!!!!!!!!!!!!!!!!!!!!
Bonjour CLaude !!
Je dois avouer que je suis impressionné par ta macro qui fonctionne exactemeent comme je le voulais !!!
Donc dernière tite chose qui serait vraiment plus commode pour les utilisateurs et après je te laisse tranquille :
-- 05 Mai 2010, 09:18 --
COmment faire pour que cette macro se réalise directement sur ma feuille synthèse sans en créé une autre , et commencer la copie a partir de la ligne A45 (car sur cette fiche de synth-èse je devrai avoir deux tableau en haut de la page?!) Merci pour ton aide en tout cas !!!
Jérémy
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonjour Jérémy, forum,
Ajoute un bouton sur la feuille "synthèse" de ton fichier
et affecte-lui ce code
Attention cette feuille est purgée à partir de la ligne 45 à chaque appel de la macro.
Sub RécupFeuilles()
Dim Lg%, Lg2%, i%, Wbk$, W As Workbook
'Macros par Claude Dubois pour "james404" Excel-Pratique le 05 Mai 10
Application.ScreenUpdating = False
Wbk = ActiveWorkbook.Name
Sheets("synthèse").Activate
Cells(45, 1) = "Récupération Feuilles" 'obligatoire pour la suite
Lg2 = Cells.Find("*", , , , xlByRows, xlPrevious).Row + 1
Range("a46:u" & Lg2).EntireRow.Delete
For Each W In Workbooks
If W.Name <> Wbk Then
W.Activate
For i = 1 To Worksheets.Count
With Worksheets(i)
If Application.CountA(.Range("k:k")) > 1 Then 'feuille à copier
'---- pour assurer si la colonne A n'est pas remplie complètement ,
'---- + identifie et sépare les feuilles par une ligne jaune ----
With Workbooks(Wbk).Sheets("synthèse")
Lg2 = .Cells.Find("*", , , , xlByRows, xlPrevious).Row + 1
.Cells(Lg2, 1) = W.Name & " - " & Worksheets(i).Name
.Rows(Lg2).Interior.ColorIndex = 6
End With
'----
Lg = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
.Range("A7:U" & Lg).Copy Destination:=Workbooks(Wbk) _
.Sheets("synthèse").Range("A65536").End(xlUp)(2)
End If
End With
Next i
End If
Next W
Workbooks(Wbk).Sheets("synthèse").Activate
End SubAmicalement
Claude
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Bonjour,
Je vois que tu ouvre d'autres postes,
merci de répondre sur la suite à donner à celui-ci
Claude
Oui dsl ... problème marquer comme résolu grâce à ton aide !!
D'ailleurs, je ne sais pas si tu as regarde mon 2nd problème, mais je pense qu'un raisonnement dans le même type est à aborder faire le tour des feuilles, selectioonner celle qui ont pour titre recap et additionner les somme ds mon onglet synthèse 2 !!
en faite, il me manque uniquement la facon de mettre "de coté" ces feuilles pour les garder pour le calcul, après, une simple addition entre les valeur de la Cellule B3 fera l'affaire , le tout écrit en vba bien sur !
- Messages
- 9'245
- Excel
- Vista Office 2007FR
- Inscrit
- 08/12/2007
- Emploi
- retraité Sce.Méthodes
Oups, je ne comprenais pas ton post car j'avais déjà fait cette manip! de toute évidence mal...
Cette fois c'est bon !! Juste pour info Claude les info kque tu me donnes me servent pour mon stage, j'ai beaucoup d'informatique surotut excel a faire, mais comme ce n'est pas mon domaine je ne connais pas tout (même si je m y interresse de + en + vu la demande !)
Dans tous les cas tu m'a fait gagner un temps précieux avec cette macro, donc je t'en remercie encore !!
Bonne journée
