Export de données d'un classeur à un autre
Bonjour à tous,
Tout d'abord, merci de proposer un site tel que celui-ci, je le parcoure avidement depuis quelques semaines
Néanmoins, j'ai un projet qui me donne pas mal de fil à retordre. J'ai réussi à coder quelques macro en VBA, mais là cela sort de ma zone de confort..
Contexte: J'ai une BDD Excel Central, dans laquelle j'aimerais regrouper le contenu de fichiers excel au même format (même colonnes, onglets, en-têtes..) nommés BDD Local. J'aimerais pouvoir coder une macro injectant les données de Local à Central dans un premier temps, en cliquant sur un bouton (donc pas de macro automatisées, afin d'éviter les copies en conflit: plus le temps de modification de Central est réduit, moins il y aura de chance que des partenaires modifient en même temps Central). La macro doit donc se situer sur le fichier Local, et donc exporter des données, et non pas les importer depuis Central.
Ce projet regroupant des résultats d'expérimentations entre plusieurs partenaires, le but serait que chacun puisse ajouter ses propres données périodiquement, qui s'afficheraient à la suite les unes des autres dans Central.
Voilà, si certains se sentent de me donner un coup de main, je leur serait très reconnaissant!
Niveau compétences, j'ai eu quelques cours de codages VBA il y a 2-3 ans, mais je me suis un peu remis dans le bain en autodidacte (enfin, avec l'aide d'internet quoi
Merci,
Bonne journée!
Bonjour Lapsa, bonjour le forum,
Tes explications sont très claires (ce qui n'est pas toujours le cas) mais manquent cruellement de précision. Ci-dessous un code passe-partout à adapter complètement à ton cas :
Sub Macro1()
'code à adapter à on cas
Dim CL As Workbook 'déclare la variable CL (Classeur Local)
Dim OL As Worksheet 'déclare la variable OL (Onglet Local)
Dim CH As String 'déclare la variable CH (CHemin d'accès)
Dim CC As Workbook 'déclare la variable CC (Classeur Central)
Dim OC As Workbook 'déclare la variable OC (Onglet Central)
Dim DEST As Range ''déclare la variable DEST (cellule de DESTination)
Set CL = ThisWorkbook 'définit le classeur CL
Set OL = CL.Sheets(1) 'définit l'onglet OL
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set CC = Workbooks("Classeur Central.xlsm") 'définit le classeur CC (génère une erreur si ce classeur n'est pas ouvert)
If Err <> 0 Then 'condition : si une erreur a été générée
CH = "C:\Users\lapsa\Documents\" 'définit le chemin d'accès CH (avec un anti slash en plus à la fin...)
Workbooks.Open (CH & "Classeur Central.xlsm") 'couvle le classeur central CC
Set CC = ActiveWorkbook 'définit le classeur CC
End If 'fin de la condition
On Error GoTo 0 'annule la gestion des erreurs
Set OC = CC.Sheets(1) 'définit l'onglet OC
Set DEST = OC.Cells(Application.Rows.Count, 1).End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST (ici première ligne vide de la colonne A de l'onglet OC)
OL.Range("A1:L" & Cells(Application.Rows.Count, 1).End(xlUp).Row).Copy DEST 'copy la plage et la colle dans DEST (ici la plage va de A1 à L... dernière ligne éditée de la colonne A)
CC.Close True 'ferme le classeur central en enregistrant les modifications
End SubBonjour ThauThème, et merci à toi pour ton aide! (Sète, la ville de Brassens?
J'ai essayé ton code en le modifiant en conséquence, mais je n'arrive pas à obtenir ce que je veux. Après quelques tatonnements, je me rend compte que la fonction utilisé pour la dernière ligne ne doit pas fonctionner de la manière adéquate:
Quand je change le code pour n'utiliser que la formule
maLigne = OLoc.Range("B" & Rows.Count).End(xlUp).Row + 1
MsgBox maLigneIl m'est retourné la ligne 2218 (ce que je n'arrive pas à expliquer), alors que je n'ai rempli qu'une quinzaine de ligne pour tester la macro.. J'ai l'impression (sans doute stupide) que la mise en forme de mes onglets y est pour quelque chose, puisque lors de l'application de ton code, j'ai quelques données qui finissent par apparaître dans les dernières lignes avec format de mon tableur..
Pour l'instant je me penche uniquement sur les données contenues dans l'onglet DATA, et extrapolerai par la suite aux autres onglets, si je finis par y arriver
Merci encore pour ton attention!
Bonjour,
Bon, avec ce code un peu modifié:
Sub Export()
Dim CLoc As Workbook 'déclare la variable CLoc (Classeur Local)
Dim OLoc As Worksheet 'déclare la variable OLoc (Onglet Local)
Dim CH As String 'déclare la variable CH (CHemin d'accès)
Dim Central As Workbook 'déclare la variable Central (Classeur Central)
Dim OCent As Worksheet 'déclare la variable OCent (Onglet Central)
Dim DEST As Range ''déclare la variable DEST (cellule de DESTination)
Dim Exp As Range
Set CLoc = ThisWorkbook 'définit le classeur CLoc
Set OLoc = CLoc.Sheets(4) 'définit l'onglet OLoc
On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
Set CCent = Application.Workbooks.Open(Filename:="C:\Users\Lapsa\Desktop\Import - Export Excel\BDD_2016_Central")
If Err <> 0 Then 'condition : si une erreur a été générée
CH = "C:\Users\Lapsa\Desktop\Import - Export Excel\" 'définit le chemin d'accès CH (avec un anti slash en plus à la fin...)
Workbooks.Open (CH & "BDD_2016_Central.xlsm") 'ouvre le classeur Central
End If 'fin de la condition
Set Central = ActiveWorkbook 'définit le classeur Central
On Error GoTo 0 'annule la gestion des erreurs
Set OCent = Central.Sheets(4) 'définit l'onglet OCent
x = OLoc.Range("B2").End(xlDown).Row + 1
MsgBox x
y = OCent.Range("C2").End(xlDown).Row + 1
MsgBox y
Z = y + x
MsgBox Z
Set DEST = OCent.Cells(y, 2)
DEST.Select
OLoc.Columns("B:AD").Rows(x).Copy DEST
'Exp = OLoc.Columns("B:AD").Rows("2:x").Value
'CCent.Range("B" & y & ":AD" & Z) = OLoc.Range("B2" & ":AD" & x)
'For i = y To (y + x)
'For j = 2 To x
'CCent.Columns("B:AD").Rows(i).Value = Exp
'Next
'Next
'OLoc.Range(Cells(2, 2), Cells(x, 30)).Select
'OCent.Range(Cells(2, 2), Cells(y, 30)) = Selection
'Set DEST = OCent.Cells(Application.Rows.Count, 2).End(xlUp).Offset(1, 0) 'définit la cellule de destination DEST (ici première ligne vide de la colonne A de l'onglet OC)
'OLoc.Range("B2:AD" & Cells(Application.Rows.Count, 2).End(xlUp).Row).Copy DEST 'copy la plage et la colle dans DEST (ici la plage va de A1 à L... dernière ligne éditée de la colonne A)
'Central.Close True 'ferme le classeur central en enregistrant les modifications
End SubJ'arrive a me rapprocher de l'objectif, cependant ce ne me copie que les colonnes J et K de local pour les mettre sur les mêmes colonnes sur Central, mais en partant de la ligne 2 et non pas de la dernière ligne remplie..