VBA - Importation de données entre classeurs
Bonsoir,
J'ai 2 classeurs 'exemple1' et 'exemple2'. J'ai créé une macro pour importer les lignes de mon tableau dans 'exemple2' qui s’exécute avec un bouton 'Importer' . Seulement à chaque fois que j'importe, les lignes que j'avais déjà importées s'ajoutent aussi, ce qui provoque des doublons de lignes. J'aimerais modifier ma macro afin d'écraser les anciennes données en cas de mise à jour. Aussi y a-t-il un code pour remplir le fichier cible sans qu'il s'ouvre?
Sub Macro_Import()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim LR As Integer 'déclare la variable LR (Ligne de Référence)
Set CS = ThisWorkbook 'définit le classeur source CS
Set OS = CS.Worksheets("Feuille1") 'définit l'onglet source OS)
TV = OS.Range("A26").CurrentRegion 'définit le tableau des valeurs TV
' On peut mettre le fichier cible n'importe où
Set CD = Workbooks.Open(Filename:="E:\Sauvegarde_Ubuntu\exemple2.xlsm")
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
If Left(TV(I, 1), 3) = "DMN" Then 'si la donnée ligne I colonne 1 de TV commence par DMN
Set OD = CD.Worksheets("Dépense_Maintenance") 'définit l'onglet destination OD (donnée ligne I colonne 3 de TV)
LR = OD.Cells(Application.Rows.Count, "A").End(xlUp).Row + 1 'définit la ligne de référence LR de la colonne B de l'onglet OD
OD.Cells(LR, "A").Value = TV(I, 1) 'renvoie dans la cellule ligne LR colonne B de l'onglet OD la donnée en ligne I colonne 4 de TV
OD.Cells(LR, "B").Value = TV(I, 2) 'renvoie dans la cellule ligne LR colonne C de l'onglet OD la donnée en ligne I colonne 5 de TV
OD.Cells(LR, "C").Value = TV(I, 7) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
OD.Cells(LR, "D").Value = TV(I, 12) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
End If 'fin de la condition
If Left(TV(I, 1), 3) = "RCO" Then 'si la donnée ligne I colonne 1 de TV commence par RCO
Set OD = CD.Worksheets("Cotisations") 'définit l'onglet destination OD (donnée ligne I colonne 3 de TV)
LR = OD.Cells(Application.Rows.Count, "A").End(xlUp).Row + 1 'définit la ligne de référence LR de la colonne B de l'onglet OD
OD.Cells(LR, "A").Value = TV(I, 1) 'renvoie dans la cellule ligne LR colonne B de l'onglet OD la donnée en ligne I colonne 4 de TV
OD.Cells(LR, "B").Value = TV(I, 2) 'renvoie dans la cellule ligne LR colonne C de l'onglet OD la donnée en ligne I colonne 5 de TV
OD.Cells(LR, "C").Value = TV(I, 7) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
OD.Cells(LR, "D").Value = TV(I, 12) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End SubBonjour Decibel,
Je te propose de remplacer ton code simplement par :
Option Explicit 'Option recommandée pour s'assurer que toutes les variables utilisées sont bien déclarées
Sub Macro_Import()
Const cCDName = "E:\Sauvegarde_Ubuntu\exemple2.xlsm" 'Nom du classeur de destination
ActiveWorkbook.SaveCopyAs Filename:=cCDName
End SubBonjour Gvialles,
Merci pour ta réponse. J'ai testé ton code, mais il me copie l'ensemble du fichier, or je voudrais seulement quelques colonnes du tableau :
Après avoir cliqué sur 'Importer', mon classeur 'exemple2' s'ouvre et le code d'origine va compléter les feuilles du classeur exemple2 (Cotisations et Dépense Maintenance) en fonction du code. Seulement après une seconde saisie, si je clique à nouveau sur 'Importer', j'obtiens cela :
Il me copie l'ancienne donnée (DMN001) puis ma nouvelle saisie (DMN002). En fait, il faudrait qu'il me recopie la ligne du code DMN001 au niveau de la cellule où se trouve le code DMN001 importé la 1ère fois (ligne 4), puis la ligne avec le DMN002 en ligne 5. Autre information qui peut être utile : chaque code est unique.
Bonjour Decibel,
Désolé pour ma première réponse un peu rapide.
Avec tes éclaircissements, je regarde à nouveau et de donne des nouvelles...
Decibel,
J'ai aménagé "Macro_Import" du classeur "Exemple1" de la façon suivante :
Option Explicit
Sub Macro_Import()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim LR_Depense As Integer 'déclare la variable LR (compteur de Ligne du volet "Dépenses...")
Dim LR_Cotisation As Integer 'déclare la variable LR (compteur de Ligne du volet "Cotisations")
Set CS = ThisWorkbook 'définit le classeur source CS
Set OS = CS.Worksheets("Feuille1") 'définit l'onglet source OS)
TV = OS.Range("A26").CurrentRegion 'définit le tableau des valeurs TV
' On peut mettre le fichier cible n'importe où
'Set CD = Workbooks.Open(Filename:="E:\Sauvegarde_Ubuntu\exemple2.xlsm")
Set CD = Workbooks.Open(Filename:="E:\EXCEL_PRATIQUE\DECIBEL\exemple2.xlsm") '---------- pour les tests GVS
LR_Depense = 3 'On initialise le compteur de ligne Dépense avec le numéro de ligne de l'entête du tableau
LR_Cotisation = 3 'On initialise le compteur de ligne Cosidations avec le numéro de ligne de l'entête du tableau
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
If Left(TV(I, 1), 3) = "DMN" Then 'si la donnée ligne I colonne 1 de TV commence par DMN
Set OD = CD.Worksheets("Dépense_Maintenance") 'définit l'onglet destination OD (donnée ligne I colonne 3 de TV)
LR_Depense = LR_Depense + 1
OD.Cells(LR_Depense, "A").Value = TV(I, 1) 'renvoie dans la cellule ligne LR colonne B de l'onglet OD la donnée en ligne I colonne 4 de TV
OD.Cells(LR_Depense, "B").Value = TV(I, 2) 'renvoie dans la cellule ligne LR colonne C de l'onglet OD la donnée en ligne I colonne 5 de TV
OD.Cells(LR_Depense, "C").Value = TV(I, 7) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
OD.Cells(LR_Depense, "D").Value = TV(I, 12) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
End If 'fin de la condition
If Left(TV(I, 1), 3) = "RCO" Then 'si la donnée ligne I colonne 1 de TV commence par RCO
Set OD = CD.Worksheets("Cotisations") 'définit l'onglet destination OD (donnée ligne I colonne 3 de TV)
LR_Cotisation = LR_Cotisation + 1
OD.Cells(LR_Cotisation, "A").Value = TV(I, 1) 'renvoie dans la cellule ligne LR colonne B de l'onglet OD la donnée en ligne I colonne 4 de TV
OD.Cells(LR_Cotisation, "B").Value = TV(I, 2) 'renvoie dans la cellule ligne LR colonne C de l'onglet OD la donnée en ligne I colonne 5 de TV
OD.Cells(LR_Cotisation, "C").Value = TV(I, 7) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
OD.Cells(LR_Cotisation, "D").Value = TV(I, 12) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Subet obtenu "Exemple2_GVS.xml" joint.
Une précision à tout hasard : pour que le code fonctionne pour toi, n'oublies pas de rétablir la ligne :
'Set CD = Workbooks.Open(Filename:="E:\Sauvegarde_Ubuntu\exemple2.xlsm")et supprimer la ligne :
Set CD = Workbooks.Open(Filename:="E:\EXCEL_PRATIQUE\DECIBEL\exemple2.xlsm") '---------- pour les tests GVSBonjour Gvialles,
Impeccable ton nouveau code
Juste que signifie 'GVS'? Peux-t-on éviter que le classeur 'exemple2-gvs.xlsm' s'ouvre?
Decibel,
"GVS", ce sont simplement mes initiales que je rajoute aux fichiers originaux pour les distinguer. Rien d'autre.
Pour éviter que le fichier "Exemple2.xlsm" ne reste ouvert après l'exécution de la macro, il suffit d'ajouter à la fin l' instruction suivante :
CD.Close TrueJe redonne toute la macro modifiée:
Option Explicit
Sub Macro_Import()
Dim CS As Workbook 'déclare la variable CS (Classeur Source)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim CD As Workbook 'déclare la variable CD (Classeur Destination)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim LR_Depense As Integer 'déclare la variable LR (compteur de Ligne du volet "Dépenses...")
Dim LR_Cotisation As Integer 'déclare la variable LR (compteur de Ligne du volet "Cotisations")
Set CS = ThisWorkbook 'définit le classeur source CS
Set OS = CS.Worksheets("Feuille1") 'définit l'onglet source OS)
TV = OS.Range("A26").CurrentRegion 'définit le tableau des valeurs TV
' On peut mettre le fichier cible n'importe où
'Set CD = Workbooks.Open(Filename:="E:\Sauvegarde_Ubuntu\exemple2.xlsm")
Set CD = Workbooks.Open(Filename:="E:\EXCEL_PRATIQUE\DECIBEL\exemple2.xlsm") '---------- pour les tests GVS
LR_Depense = 3 'On initialise le compteur de ligne Dépense avec le numéro de ligne de l'entête du tableau
LR_Cotisation = 3 'On initialise le compteur de ligne Cosidations avec le numéro de ligne de l'entête du tableau
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
If Left(TV(I, 1), 3) = "DMN" Then 'si la donnée ligne I colonne 1 de TV commence par DMN
Set OD = CD.Worksheets("Dépense_Maintenance") 'définit l'onglet destination OD (donnée ligne I colonne 3 de TV)
LR_Depense = LR_Depense + 1
OD.Cells(LR_Depense, "A").Value = TV(I, 1) 'renvoie dans la cellule ligne LR colonne B de l'onglet OD la donnée en ligne I colonne 4 de TV
OD.Cells(LR_Depense, "B").Value = TV(I, 2) 'renvoie dans la cellule ligne LR colonne C de l'onglet OD la donnée en ligne I colonne 5 de TV
OD.Cells(LR_Depense, "C").Value = TV(I, 7) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
OD.Cells(LR_Depense, "D").Value = TV(I, 12) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
End If 'fin de la condition
If Left(TV(I, 1), 3) = "RCO" Then 'si la donnée ligne I colonne 1 de TV commence par RCO
Set OD = CD.Worksheets("Cotisations") 'définit l'onglet destination OD (donnée ligne I colonne 3 de TV)
LR_Cotisation = LR_Cotisation + 1
OD.Cells(LR_Cotisation, "A").Value = TV(I, 1) 'renvoie dans la cellule ligne LR colonne B de l'onglet OD la donnée en ligne I colonne 4 de TV
OD.Cells(LR_Cotisation, "B").Value = TV(I, 2) 'renvoie dans la cellule ligne LR colonne C de l'onglet OD la donnée en ligne I colonne 5 de TV
OD.Cells(LR_Cotisation, "C").Value = TV(I, 7) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
OD.Cells(LR_Cotisation, "D").Value = TV(I, 12) 'renvoie dans la cellule ligne LR colonne D de l'onglet OD la donnée en ligne I colonne 6 de TV
End If 'fin de la condition
Next I 'prochaine ligne de la boucle
CD.Close True
Set CD = Nothing
End SubJe te remercie Gvialles