TooEasy
Nouveau membre
Bonjour à tous,
J'ai un programme provenant de l'assemblage de différents bouts de code glanés sur le Net
et quelques (rares) adaptations personnelles. Le but de ce programme est le suivant :
On ouvre un classeur - CLASSEUR.xlm - et on lance la macro. Plus tard ce sera par un bouton, pour l'instant c'est manuel.
La macro crée le fichier - FUSION.xlsx - dans le répertoire système %HOMEPATH%.
Grâce à la commande "GetOpenFileName", l'utilisateur peut sélectionner les fichiers qu'il veut concaténer ou non, dans ce cas, il sort du programme.
La macro ouvre donc le fichier SOURCE et le fichier CIBLE et normalement devrait copier/coller les feuilles SOURCE vers les feuilles CIBLES. Et c'est là que les ennuis arrivent.
La macro le fait mais partiellement. Ainsi la première feuille contient 4 lignes alors qu'elle devrait en avoir 760.
La seconde répond aux attentes mais je n'ai pas les suivantes seulement la dernière qui correspond à la 6ème feuille du classeur SOURCE.
Ce qui revient à dire que mon COPIER/COLLER est pourri. Trois enregistreurs de macros plus tard, je ne comprends toujours pas ce qui coince. Il faut dire que je ne suis pas un as du VBA, loin s'en faut, et je suis complètement dans les choux.
Si une âme charitable (ou plusieurs) pouvait me dire la bourde que j'ai commise, j'en serai ravi. Parce qu'à force d'avoir le nez dessus je ne vois pas ce qui "coince".
En vous remerciant de bien vouloir éclairer ma lanterne et de m'accorder un peu de votre temps.
Ci-dessous le code :
Merci pour votre aide.
Greg.
J'ai un programme provenant de l'assemblage de différents bouts de code glanés sur le Net
et quelques (rares) adaptations personnelles. Le but de ce programme est le suivant :
On ouvre un classeur - CLASSEUR.xlm - et on lance la macro. Plus tard ce sera par un bouton, pour l'instant c'est manuel.
La macro crée le fichier - FUSION.xlsx - dans le répertoire système %HOMEPATH%.
Grâce à la commande "GetOpenFileName", l'utilisateur peut sélectionner les fichiers qu'il veut concaténer ou non, dans ce cas, il sort du programme.
La macro ouvre donc le fichier SOURCE et le fichier CIBLE et normalement devrait copier/coller les feuilles SOURCE vers les feuilles CIBLES. Et c'est là que les ennuis arrivent.
La macro le fait mais partiellement. Ainsi la première feuille contient 4 lignes alors qu'elle devrait en avoir 760.
La seconde répond aux attentes mais je n'ai pas les suivantes seulement la dernière qui correspond à la 6ème feuille du classeur SOURCE.
Ce qui revient à dire que mon COPIER/COLLER est pourri. Trois enregistreurs de macros plus tard, je ne comprends toujours pas ce qui coince. Il faut dire que je ne suis pas un as du VBA, loin s'en faut, et je suis complètement dans les choux.
Si une âme charitable (ou plusieurs) pouvait me dire la bourde que j'ai commise, j'en serai ravi. Parce qu'à force d'avoir le nez dessus je ne vois pas ce qui "coince".
En vous remerciant de bien vouloir éclairer ma lanterne et de m'accorder un peu de votre temps.
Ci-dessous le code :
Code:
Sub Creer_Recapitulatif()
'-------------------------------------------------------------------------------
' But :
' Macro qui permet de copier les informations contenues dans
' différents fichiers pour les coller dans un fichier récapitulatif
'
' Crédits :
' Adapté par Tof d'après les scenarii de GCXL et des autres contributeurs du Web
'
'
' A voir : Les feuilles CIBLE les créer si N'EXISTE PAS
' Voir également si elles ont le même NOM !!
'-------------------------------------------------------------------------------
Dim wbRecap As Workbook, wbSource As Workbook ' Classeurs CIBLE, SOURCE
Dim wsRecap As Worksheet, wsSource As Worksheet ' Feuilles en CIBLE, SOURCE
Dim vFichiers As Variant ' Noms des fichiers (array)
Dim i As Integer, k As Integer
Dim rgRecap As Range ' Plage où on copie les données
Dim FichierExiste As Boolean
'
' Initialisation des VARIABLES de boucles
k = 1
i = 1
PathDir = Environ("HOMEPATH")
FileCible = "C:" & PathDir & "\FUSION.xlsx"
MsgBox "Le fichier qui collecte les données s'appelle : " & Chr(13) & Chr(10) _
& FileCible
'
' S'il a été oublié lors d'une précédente FUSION ... On le désintègre!
FichierExiste = Dir(FileCible) <> ""
If FichierExiste Then
Kill FileCible
End If
'
' Ouverture du fichier et sauvegarde
Set wbRecap = Application.Workbooks.Add
wbRecap.SaveAs FileCible ' Renommer le fichier en Chemin Absolu
'
' Ouvrir boîte de dialogue pour sélectionner les fichiers à ouvrir
vFichiers = Selectionner_Fichiers("Sélectionner les fichiers à compiler")
'
' Vérifier qu'au moins un fichier à été sélectionné
If Not IsArray(vFichiers) Then
Debug.Print "Aucun fichier sélectionné."
MsgBox "Aucun fichier sélectionné : Fin du programme"
Exit Sub
End If
On Error Resume Next
Application.ScreenUpdating = False
'
' Boucle de CHOIX de fichier(s)
For k = 1 To UBound(vFichiers)
'
' DEBUT du COPIER / COLLER
Set wbSource = Workbooks.Open(Filename:=vFichiers(k)) ' Ouverture du classeur SOURCE
Set wbRecap = Workbooks.Open(Filename:=FileCible) ' Ouverture du classeur CIBLE
For Each wsSource In wbSource.Worksheets
Set wsRecap = wbRecap.Sheets(wsSource.CodeName) ' Feuille CIBLE
wsSource.Activate ' Sélection des cellules de la feuille (C'EST A PARTIR D'ICI QUE C'EST PAS BON DU TOUT )
wsSource.UsedRange.Copy ' Copie des cellules
wbRecap.Add After:=Sheets(Sheets.Count) ' Positionnement de la nouvelle feuille
wsRecap.Paste
wsRecap.Name = k & "." & i
wsSource.Activate
i = i + 1 'Incrémentation des feuilles (ex: 1.1, 1.2, etc.)
Next
wbSource.Close 'fermer classeur SOURCE
wbRecap.Save
wbRecap.Close 'fermer classeur CIBLE
Set wbRecap = Nothing
Set wbSource = Nothing
Next
' ICI, il faut faire le ménage ...
Application.ScreenUpdating = True
MsgBox "Fin du Programme"
End Sub
Function Selectionner_Fichiers(sTitre As String) As Variant
Dim sFiltre As String, bMultiSelect As Boolean
sFiltre = "Fichiers XYZ (.xls)(.xlsm), *.xls*"
'
' bMultiSelect à True = Permet de choisir plusieurs fichiers à la fois
bMultiSelect = True
Selectionner_Fichiers = Application.GetOpenFilename(Filefilter:=sFiltre, Title:=sTitre, MultiSelect:=bMultiSelect)
End Function
Merci pour votre aide.
Greg.