VBA transfert des données d'un classeur vers d'un autre
Bonsoir,
est ce que vous pourriez m'aider à corriger la macro jointe :
Je voudrai importer automatiquement la totalité des données contenues dans la feuille 1 de 2 classeurs source différents dans les 2 premiers onglets d'un 3ème classeur de destination. c'est tout bêtement un copier coller de la totalité des données mais sans dupliquer la feuille.
les fichiers sources sont des fichiers brut d'extraction sauvegardés sous des noms différents en fonction des dates d'extraction. Ils comportent des données différentes. Donc l'idéal serait que la macro puisse donner le choix pour ouvrir le fichier source dans les répertoires de travail, effectuer le copier coller dans l'onglet correspondant du fichier destinataire et fermer le fichier source. Ces opérations peuvent se répèter plusieurs fois dans l'année et c'est pourquoi la notion de la dernière ligne est importante pour rajouter en cours de route les données nouvelles en dessous de celles déjà transférées.
Le fichier destinataire comporte plusieurs onglets dont les 2 premiers reprennent chacun les données des 2 fichiers sources ; ces onglets sont nommés expressément feuille1(ALIFM) feuille2(GRC), les données doivent subir ensuite un traitement pour être compilées dans un 3ème onglet.
J'ai essayé de bricoler la macro qui suit : le copier coller ne se fait pas correctement ni dans la feuille1 de l'onglet de destination ni dans la feuille2 si je change le numéro de la feuille dans la macro. Je ne crois pas que la syntaxe pour copier coller toutes les données d'une feuille que j'ai employée soit la bonne ? je voudrai également suprimer la variable k qui sert à ouvrir le fichier suivant.
Merci d'avance pour votre aide.
Sub trasfert_fichiers()
Dim wsRecap As Worksheet 'feuille où on écrit les données fichier destinataire
Dim wbSource As Workbook 'fichier source à ouvrir
Dim wsSource As Worksheet 'feuille du fichier source où on cherche les données
Dim DernLign As Integer 'ligne où on écrit les données
Dim vFichiers As Variant 'noms des fichiers
Dim i As Integer, k As Integer ' ?
Dim rgRecap As Range 'plage où on copie les données
Set wbRecap = ThisWorkbook 'Fichier récapitulatif
Set wsRecap = wbRecap.Sheets(1) 'on écrit dans la feuille 1 du fichier récapitulatif
' --- Ouvrir boite de dialogue pour sélectionner les fichiers à ouvrir
vFichiers = Selectionner_Fichiers("Sélectionner les fichiers à compiler") 'Appel de Fonction pour ouvrir fichiers
' --- Vérifier qu'au moins un fichier à été sélectionné
If Not IsArray(vFichiers) Then
Debug.Print "Aucun fichier sélectionné."
MsgBox "Erreur! Aucun/Mauvais fichier sélectionné."
Exit Sub
End If
On Error Resume Next
Application.ScreenUpdating = False
' --- Boucle à travers les fichiers
For k = 1 To UBound(vFichiers)
Application.StatusBar = ">> Lecture du fichier #" & k & "/" & UBound(vFichiers)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' les instructions
Set wbSource = Workbooks.Open(vFichiers(k)) 'ouverture du fichier source feuille1
Set wsSource = wbSource.Sheets(1) ' copie des données de la feuille1
DernLign = wbRecap.Sheets(1).Range("A60000").End(xlUp).Row + 1 'ligne pour écrire le log des fichiers compilés
' - On copie les données vers le fichier Recapitulatif; à adapter
Set rgRecap = wsRecap.Range("A65000").End(xlUp).Offset(0, 0)
rgRecap = Date
With wsSource
rgRecap(Cells) = .Range(Cells) ' CA NE MARCHE PAS ?
End With
wbSource.Close 'fermeture fichier du fichier source
Set wbSource = Nothing
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Next k
Application.ScreenUpdating = True
Application.StatusBar = False
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
Selectionner_Fichiers = Application.GetOpenFilename(Filefilter:=sFiltre, Title:=sTitre, MultiSelect:=bMultiSelect)
End Function
Hello,
Sauf erreur de ma part, il manque une composante essentielle : les colonnes.
Sinon :
- On copie les données vers le fichier Recapitulatif; à adapter
Set rgRecap = wsRecap.Range("A65000").End(xlUp).Offset(0, 0)
rgRecap = Date
With wsSource
rgRecap(Cells) = .Range(Cells) ' CA NE MARCHE PAS ?
Tu affectes 1 cellule à rgRecap, puis tu lui affectes la date du jour (on passe sur le offset qui décale de 0 ligne et 0 colonne ^^) ;
et rgRecap(Cells) n'est pas une instruction valide. Cells doit etre suivi de l'index de ligne et de l'index de colonne : Cells(Row, Col). C'est l'équivalent de L1C1.
As-tu des intitulés de colonnes ?
Il te faudrait plus un truc du genre
With wsSurce
lR(1)= .UsedRange.Rows.Count
lC(1) = .UsedRange.Columns.Count
oRng = .Range(Cells(1, 1), Cells(lR(1), lC(1))).Value
End with
With wsRecap
lR(0) = .UsedRange.Rows.Count
End with
For K = 1 to Ubound(oRng, 1)
For J = 1 to Ubound(orng, 2)
wsRecap.Cells(lR(0) + K, J) = oRng(K, J)
Next K
Next J
A (re)voir au réveil (autant pour toi que pour moi :] )
Bonjour,
Merci beaucoup pour ta réponse.
J'ai remplacé les instructions concernant le copier coller, (j'ai seulement remplacé la variable k déjà utilisée dans la macro par m )
mais cela ne marche toujours pas avec le message d'erreur suivant :
SUB OU FONCTION NON DEFINI et cela s'arrête sur lR(1)
oui j'ai des intitulés de colonnes sur la première ligne
Voici la macro corrigée comme indiquée
Sub trasfert_fichiers()
Dim wsRecap As Worksheet 'feuille où on écrit les données
Dim wbSource As Workbook 'fichier à ouvrir
Dim wsSource As Worksheet 'feuille où on cherche les données
Dim DernLign As Integer 'ligne où on écrit les données
Dim vFichiers As Variant 'noms des fichiers
Dim i As Integer, k As Integer
Dim rgRecap As Range 'plage où on copie les données
Set wbRecap = ThisWorkbook 'Fichier récapitulatif
Set wsRecap = wbRecap.Sheets(1) 'on écrit dans la feuille 1 du fichier récapitulatif
' --- Ouvrir boite de dialogue pour sélectionner les fichiers à ouvrir
vFichiers = Selectionner_Fichiers("Sélectionner les fichiers à compiler") 'Appel de Fonction pour ouvrir fichiers
' --- Vérifier qu'au moins un fichier à été sélectionné
If Not IsArray(vFichiers) Then
Debug.Print "Aucun fichier sélectionné."
MsgBox "Erreur! Aucun/Mauvais fichier sélectionné."
Exit Sub
End If
On Error Resume Next
Application.ScreenUpdating = False
' --- Boucle à travers les fichiers
For k = 1 To UBound(vFichiers)
Application.StatusBar = ">> Lecture du fichier #" & k & "/" & UBound(vFichiers)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' C'est ici qu'on écrit les instructions
Set wbSource = Workbooks.Open(vFichiers(k)) 'on ouvre le fichier
Set wsSource = wbSource.Sheets(1) 'On copie les données de la feuille 1
DernLign = wbRecap.Sheets(1).Range("A60000").End(xlUp).Row + 1 'ligne pour écrire le log des fichiers compilés
' - On copie les données vers le fichier Recapitulatif; à adapter
Set rgRecap = wsRecap.Range("A65000").End(xlUp).Offset(0, 0)
rgRecap = Time
With wsSource
lR(1) = .UsedRange.Rows.Count
lC(1) = .UsedRange.Columns.Count
oRng = .Range(Cells(1, 1), Cells(lR(1), lC(1))).Value
End With
With wsRecap
lR(0) = .UsedRange.Rows.Count
End With
For L = 1 To UBound(oRng, 1)
For J = 1 To UBound(oRng, 2)
wsRecap.Cells(lR(0) + L, J) = oRng(L, J)
Next L
Next J
End With
wbSource.Close 'fermer fichier
Set wbSource = Nothing
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Next k
Application.ScreenUpdating = True
Application.StatusBar = False
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
Selectionner_Fichiers = Application.GetOpenFilename(Filefilter:=sFiltre, Title:=sTitre, MultiSelect:=bMultiSelect)
End Function
Un code indenté et balisé ([ code=vb][ /code] est bien plus facile à lire pour les helpeurs et lecteurs
Je regarde ça.
EDIT : Ok c'est simple, tu n'as pas déclaré les variables lR() et lC().
Prends l'habitude de placer "Option explicit" en début de module, hors de la procédure, pour t'obliger à déclarer.
Ca devrait mieux marcher comme ça
Sub trasfert_fichiers()
Dim wsRecap As Worksheet 'feuille où on écrit les données
Dim wbSource As Workbook 'fichier à ouvrir
Dim wsSource As Worksheet 'feuille où on cherche les données
Dim lR(1) As Integer, lC(1) as integer 'ligne où on écrit les données
Dim vFichiers As Variant 'noms des fichiers
Dim i As Integer, k As Integer
Dim rgRecap As Range 'plage où on copie les données
Set wbRecap = ThisWorkbook 'Fichier récapitulatif
Set wsRecap = wbRecap.Sheets(1) 'on écrit dans la feuille 1 du fichier récapitulatif
' --- Ouvrir boite de dialogue pour sélectionner les fichiers à ouvrir
vFichiers = Selectionner_Fichiers("Sélectionner les fichiers à compiler") 'Appel de Fonction pour ouvrir fichiers
' --- Vérifier qu'au moins un fichier à été sélectionné
If Not IsArray(vFichiers) Then
Debug.Print "Aucun fichier sélectionné."
MsgBox "Erreur! Aucun/Mauvais fichier sélectionné."
Exit Sub
End If
On Error Resume Next
Application.ScreenUpdating = False
' --- Boucle à travers les fichiers
For k = 1 To UBound(vFichiers)
Application.StatusBar = ">> Lecture du fichier #" & k & "/" & UBound(vFichiers)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' C'est ici qu'on écrit les instructions
Set wbSource = Workbooks.Open(vFichiers(k)) 'on ouvre le fichier
Set wsSource = wbSource.Sheets(1) 'On copie les données de la feuille 1
DernLign = wbRecap.Sheets(1).Range("A60000").End(xlUp).Row + 1 'ligne pour écrire le log des fichiers compilés
' - On copie les données vers le fichier Recapitulatif; à adapter
Set rgRecap = wsRecap.Range("A65000").End(xlUp).Offset(0, 0)
rgRecap = Time
With wsSource
lR(1) = .UsedRange.Rows.Count
lC(1) = .UsedRange.Columns.Count
oRng = .Range(Cells(1, 1), Cells(lR(1), lC(1))).Value
End With
With wsRecap
lR(0) = .UsedRange.Rows.Count
End With
For L = 1 To UBound(oRng, 1)
For J = 1 To UBound(oRng, 2)
wsRecap.Cells(lR(0) + L, J) = oRng(L, J)
Next L
Next J
End With
wbSource.Close 'fermer fichier
Set wbSource = Nothing
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Next k
Application.ScreenUpdating = True
Application.StatusBar = False
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
Selectionner_Fichiers = Application.GetOpenFilename(Filefilter:=sFiltre, Title:=sTitre, MultiSelect:=bMultiSelect)
End Function
Merci de répondre aussi vite mais désolée ça ne marche toujours pas :
J'ai recopié la macro, j'ai défini les variables L et J et j'ai le message d'erreur suivant :
le surseur se positione sur :
wsRecap.Cells(lR(0) + L, J) = oRng(L, J)
Next L
Next J
macro :
Sub trasfert_fichiers()
Dim wsRecap As Worksheet 'feuille où on écrit les données
Dim wbSource As Workbook 'fichier à ouvrir
Dim wsSource As Worksheet 'feuille où on cherche les données
Dim lR(1) As Integer, lC(1) As Integer 'ligne où on écrit les données (ou l'équivalent : Dim lR(1)%, lC(1)%)
Dim L As Integer, J As Integer
Dim vFichiers As Variant 'noms des fichiers
Dim i As Integer, k As Integer
Dim rgRecap As Range 'plage où on copie les données
Set wbRecap = ThisWorkbook 'Fichier récapitulatif
Set wsRecap = wbRecap.Sheets(1) 'on écrit dans la feuille 1 du fichier récapitulatif
' --- Ouvrir boite de dialogue pour sélectionner les fichiers à ouvrir
vFichiers = Selectionner_Fichiers("Sélectionner les fichiers à compiler") 'Appel de Fonction pour ouvrir fichiers
' --- Vérifier qu'au moins un fichier à été sélectionné
If Not IsArray(vFichiers) Then
Debug.Print "Aucun fichier sélectionné."
MsgBox "Erreur! Aucun/Mauvais fichier sélectionné."
Exit Sub
End If
On Error Resume Next
Application.ScreenUpdating = False
' --- Boucle à travers les fichiers
For k = 1 To UBound(vFichiers)
Application.StatusBar = ">> Lecture du fichier #" & k & "/" & UBound(vFichiers)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' C'est ici qu'on écrit les instructions
Set wbSource = Workbooks.Open(vFichiers(k)) 'on ouvre le fichier
Set wsSource = wbSource.Sheets(1) 'On copie les données de la feuille 1
DernLign = wbRecap.Sheets(1).Range("A60000").End(xlUp).Row + 1 'ligne pour écrire le log des fichiers compilés
' - On copie les données vers le fichier Recapitulatif; à adapter
Set rgRecap = wsRecap.Range("A65000").End(xlUp).Offset(0, 0)
rgRecap = Time
With wsSource
lR(1) = .UsedRange.Rows.Count
lC(1) = .UsedRange.Columns.Count
oRng = .Range(Cells(1, 1), Cells(lR(1), lC(1))).Value
End With
With wsRecap
lR(0) = .UsedRange.Rows.Count
End With
For L = 1 To UBound(oRng, 1)
For J = 1 To UBound(oRng, 2)
wsRecap.Cells(lR(0) + L, J) = oRng(L, J)
Next L
Next J
End With
wbSource.Close 'fermer fichier
Set wbSource = Nothing
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Next k
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
Un code indenté et balisé ([ code=vb][ /code] est bien plus facile à lire pour les helpeurs et lecteurs
Quel est le message d'erreur ?
OUPS j'ai oublié de le mentionner :
ERREUR DE COMPILATION référence de variable de contrôle incorrecte dans next et NEXT L est mis en surbrillance.
Cordialement
Inverse Next L et Next J
Bonjour,
Désolée, mais rien ne se passe ??
j'ai inversé l'ordre des variables dans les next et j'ai suprimé un End with car sans with. Je ne comprends pas pourquoi cela ne fonctionne pas.
Cordialement
Sub transfert_fichiers()
Dim wsRecap As Worksheet 'feuille où on écrit les données
Dim wbSource As Workbook 'fichier à ouvrir
Dim wsSource As Worksheet 'feuille où on cherche les données
Dim lR(1) As Integer, lC(1) As Integer 'ligne où on écrit les données
Dim vFichiers As Variant 'noms des fichiers
Dim i As Integer, k As Integer
Dim L As Integer, J As Integer
Dim rgRecap As Range 'plage où on copie les données
Set wbRecap = ThisWorkbook 'Fichier récapitulatif
Set wsRecap = wbRecap.Sheets(1) 'on écrit dans la feuille 1 du fichier récapitulatif
' --- Ouvrir boite de dialogue pour sélectionner les fichiers à ouvrir
vFichiers = Selectionner_Fichiers("Sélectionner les fichiers à compiler") 'Appel de Fonction pour ouvrir fichiers
' --- Vérifier qu'au moins un fichier à été sélectionné
If Not IsArray(vFichiers) Then
Debug.Print "Aucun fichier sélectionné."
MsgBox "Erreur! Aucun/Mauvais fichier sélectionné."
Exit Sub
End If
On Error Resume Next
Application.ScreenUpdating = False
' --- Boucle à travers les fichiers
For k = 1 To UBound(vFichiers)
Application.StatusBar = ">> Lecture du fichier #" & k & "/" & UBound(vFichiers)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' C'est ici qu'on écrit les instructions
Set wbSource = Workbooks.Open(vFichiers(k)) 'on ouvre le fichier
Set wsSource = wbSource.Sheets(1) 'On copie les données de la feuille 1
DernLign = wbRecap.Sheets(1).Range("A60000").End(xlUp).Row + 1 'ligne pour écrire le log des fichiers compilés
' - On copie les données vers le fichier Recapitulatif; à adapter
Set rgRecap = wsRecap.Range("A65000").End(xlUp).Offset(0, 0)
rgRecap = Time
With wsSource
lR(1) = .UsedRange.Rows.Count
lC(1) = .UsedRange.Columns.Count
oRng = .Range(Cells(1, 1), Cells(lR(1), lC(1))).Value
End With
With wsRecap
lR(0) = .UsedRange.Rows.Count
End With
For L = 1 To UBound(oRng, 1)
For J = 1 To UBound(oRng, 2)
wsRecap.Cells(lR(0) + L, J) = oRng(L, J)
Next J
Next L
wbSource.Close 'fermer fichier
Set wbSource = Nothing
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Next k
Application.ScreenUpdating = True
Application.StatusBar = False
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
Selectionner_Fichiers = Application.GetOpenFilename(Filefilter:=sFiltre, Title:=sTitre, MultiSelect:=bMultiSelect)
End Function
Stop. Je ne vais pas te répéter à chaque message de baliser ton code.
Jusque là, débrouille toi.