Copier et mise à jour de données d'un tableau vers un autre tableau
Bonjour,
Je suis très novice en macro et je souhaite réaliser une copie de donnée d'un tableau source appartenant a un classeur vers un tableau d'un autre classeur de traitement des données.
Mais je souhaite également mettre à jour les éventuelles modifications apportées dans le tableau source.
Pour cela, j'ai créer 2 fichiers Excel :
Fichier source : Demandes outillages
Fichier de traitement et d'organisation : Gestion
Pourriez-vous me venir en aide ?
je joints les 2 fichiers.
Merci d'avance.
Cordialement
David
Bonjour,
Je suis très novice en macro
Novice ... hum dans ce fil en 2020 vous le disiez déjà -->https://forum.excel-pratique.com/s/goto/924062....
En regardant votre fichier (joli d'ailleurs) :
- pourquoi vous ne faites pas tout dans le même fichier ?
- le code concerné est bien la Sub Importation_Demandes_macro2()?
Mais je souhaite également mettre à jour les éventuelles modifications apportées dans le tableau source.
- Peut-être alors en premier vider le tableau et réimporter tout le tableau Source à chaque fois ? Possible cela ?
- dans le code du fichier gestion vous mentionnez une feuille Planning. Quid ?
Crdlt
Bonjour,
Effectivement en 2020 j'avais déjà demandé de l'aide et mon activité ne m'a pas permis d'approfondir mes connaissances en la matière d’où ma demande de ce jour pour lequel je souhaite développer ces fichiers.
je ne souhaite pas tout gérer dans le même fichier pour la simple raison, que le fichier "GESTION" est celui qui sera accessible uniquement par moi afin d'établir mon organisation et mon suivi.
le fichier des demandes outillages sera un fichier partagé par les différents services et demandeurs.
Mon besoin et donc de ramener et mettre à jour les données du fichier "Demandes outillages" uniquement les données de la colonne A à p dans le fichier "GESTION".
Du fichier "CHARGE" j'affecte une ressource et bien plus de données qui seront pour certaines, renvoyées dans le fichier "Demandes outillages" de façon que les demandeurs puissent également suivre leurs besoins.
j'ai testé les 2 macros (1 et 2) qui ne fonctionnent pas et je capitule.
Effectivement j'ai dû laisser des reliquats de la macro que j'avais réussi à faire à l'époque mais que je n'arrive pas à faire fonctionner avec des tableaux automatiques.
je vous remercie pour votre aide.
cordialement
David
Bonjour
Voici le code à placer dans votre fichier Gestion
Sub Importation_Demandes_macro3()
Dim F_DO As String
Dim tbSource As ListObject, tbDest As ListObject
Application.ScreenUpdating = False 'on bloque l'ecran
' chemin des classeur pour test
F_DO = "C:\Users\apalo\Desktop\ODP\Demandes outillages.xlsm" ' Chemin du classeur "Demande outillage"
'F_DO = ThisWorkbook.Path & "\demandes-outillages.xlsm" 'chemin si fichier demandes outillages dans le même repertoire que fichier demandes outillages
Workbooks.Open Filename:=F_DO
Set tbSource = Workbooks("Demandes-outillages.xlsm").Sheets("Demandes outillages").ListObjects(1)
Set tbDest = ThisWorkbook.Sheets("Charge").ListObjects(1)
tbSource.AutoFilter.ShowAllData
tbDest.AutoFilter.ShowAllData
Dim i As Integer, lig As Integer
Dim j As Byte
For i = 1 To tbSource.ListRows.Count
On Error Resume Next
lig = WorksheetFunction.Match(tbSource.DataBodyRange(i, 1).Value, tbDest.ListColumns(1).DataBodyRange.Value, 0)
If lig > 0 Then 'cas mise a jour de donnees si existantes en feuille Charge
With tbDest.DataBodyRange
For j = 2 To 16 'remise a jour des colonnes B a P
.Item(lig, j) = tbSource.DataBodyRange(i, j).Value
Next j
End With
Else: 'cas ajout ligne de donnees si non existantes en feuille Charge
With tbDest
If .ListRows.Count = 0 Then
.ListRows.Add: lig = 1
Else: .ListRows.Add: lig = .ListRows.Count
End If
With .DataBodyRange
For j = 1 To 16 'ajout nouvelles donnees des colonnes A a P
.Item(lig, j) = tbSource.DataBodyRange(i, j).Value 'ajoute des donnees colonnes A a P
Next j
End With
End With
End If
On Error GoTo 0
lig = 0
Next i
'Fermer le fichier "Utilisation imprimante"
Workbooks("Demandes outillages.xlsm").Close savechanges:=False
End SubSi ok et terminé pensez à
Cordialement
Bonjour Dan,
Merci beaucoup pour le code, il fonctionne et correspond exactement à mon besoin.
Je vais l'étudier de façon à bien le comprendre et si besoin, je pourrais me permettre de revenir vers vous en cas de questions ?
Bien-sûr sur ce fil de discussions.
Merci encore
Cordialement
David
Re
Je vais l'étudier de façon à bien le comprendre et si besoin, je pourrais me permettre de revenir vers vous en cas de questions ?
Mais bien entendu.
Cordialement
Bonsoir DAN,
Je suis désolé de revenir sur mon besoin, mais j'ai du mal à comprendre le fonctionnement du code.
J'ai tester de renouveler ton code pour comprendre et rajouter d'autre besoin qui sont de copier des données d'une colonne du tableau source dans une colonne différente du tableau de destination. (classeur suivi-outillages)
Afin de bien comprendre ton code, pourrais-tu m'expliquer ton code en commentaire comme j'ai commencé à le faire ?
Dans le code, j'aimerais rajouter les données de la colonne :
X du tableau source dans la colonne W du tableau destination
AB du tableau source dans la colonne Y du tableau destination
AC du tableau source dans la colonne Z du tableau destination
AD du tableau source dans la colonne AA du tableau destination
Merci pour ton aide.
Bonjour
Afin de bien comprendre ton code, pourrais-tu m'expliquer ton code en commentaire comme j'ai commencé à le faire ?
Je suppose que l'on parle du code importation. Si oui voyez le fichier joint
Dans le code, j'aimerais rajouter les données de la colonne :
J'ai trois fichiers là...
tableau source c'est bien le fichier demande outillages ? Car le code concerne ces deux fichiers là et pas le fichier suivi
Où alors en fait le fichier demande outillages ne sert peut être à rien dans votre demande ?
Bonjour,
Effectivement j’ai 3 fichiers qui seront liés.
Le fichier demandes outillages et pour formaliser toutes les demandes de chaque lignes de production.
le fichier gestion est uniquement pour moi afin de gérer les demandes et ma charge . Ainsi que la réalisation de mes tableaux de bord.
le fichier suivi outillages est pour mon équipe afin qu’ils puissent renseigner toutes les données que je leurs demandent.(fournisseur, prix, etc)
De mon fichier gestion, je vais récupérer des données du fichier suivi outillages et renvoyer des éléments dans le fichier des demandes outillages pour informer les demandeurs sans que cela pollue mon équipe.
J’espère avoir été suffisamment claire sur mon besoin . Le but et que j’arrive à comprendre le code de façon que je puisse réaliser le lien entre mes fichiers et surtout pouvoir le faire évoluer.
Encore un grand merci à toi pour m’aider sur le sujet.
Cordialement
David
De mon fichier gestion, je vais récupérer des données du fichier suivi outillages et renvoyer des éléments dans le fichier des demandes outillages pour informer les demandeurs sans que cela pollue mon équipe.
Ok donc dans le fichier Gestion il faut rajouter des infos dans les colonnes
X du tableau source dans la colonne W du tableau destination
......
Le tableau source c'est bien suivi outillages ?
Il y aura des données du tableau Gestion vers le tableau suivi outillages et il y aura des infos du tableau suivi outillages vers le fichier Gestion.
Ce que je voulais d’abord faire c’est du fichier Gestion vers le fichier suivi.
Colonne X du tableau gestion dans la colonne W du tableau suivi outillages.
Idem pour les colonnes ci-dessous
AB du tableau source dans la colonne Y du tableau destination
AC du tableau source dans la colonne Z du tableau destination
AD du tableau source dans la colonne AA du tableau destination
Ce que je voulais d’abord faire c’est du fichier Gestion vers le fichier suivi.
Ok.
Important --> Est-ce que le numéro d'identification en colonne 1 concerne le même outillage dans les deux fichiers ?
Oui c’est la référence de la demande et ID de l’outillage pour avoir un numéro unique.
Essayez avec ce code à placer dans votre fichier Gestion
Sub export_donnees()
Dim F_SO As String, fichier As String
Dim tbSource As ListObject, tbDest As ListObject
fichier = "Suivi-outillages.xlsm" 'nom fichier
F_SO = "C:\Users\apalo\Desktop\ODP\" & fichier ' Chemin du classeur "Suivi outillage"
' Ouvrir le classeur "Suivi outillages"
Workbooks.Open Filename:=F_SO
Set tbSource = ThisWorkbook.Sheets("CHARGE").ListObjects(1)
Set tbDest = Workbooks(fichier).Sheets("Avancement outillages").ListObjects(1)
tbSource.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "Demandes outillages"
tbDest.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "CHARGE"
Dim i As Integer, lig As Integer
For i = 1 To tbSource.ListRows.Count
On Error Resume Next 'gestion erreur sur variable lig
lig = WorksheetFunction.Match(tbSource.DataBodyRange(i, 1).Value, tbDest.ListColumns(1).DataBodyRange.Value, 0)
If lig > 0 Then 'cas mise a jour de donnees si numero identification est dans le fichier suivi outillage
With tbDest.DataBodyRange
.Item(lig, 23) = tbSource.DataBodyRange(i, 24).Value 'Colonne X du tableau gestion dans la colonne W du tableau suivi outillages.
.Item(lig, 25) = tbSource.DataBodyRange(i, 28).Value 'AB du tableau source dans la colonne Y du tableau destination
.Item(lig, 26) = tbSource.DataBodyRange(i, 29).Value 'AC du tableau source dans la colonne Z du tableau destination
.Item(lig, 27) = tbSource.DataBodyRange(i, 30).Value 'AD du tableau source dans la colonne AA du tableau destination
End With
End If
On Error GoTo 0
lig = 0 'remettre variable lig à 0
Next i
'Fermer le fichier "suivi outillages" et enregistrer
Workbooks(fichier).Close savechanges:=True
End SubNB : si l'ID n'est pas trouvé la variable lig sera nulle et le code n'importera pas de données dans le fichier de destination
Merci pour le code il fonction très bien.
Je viens de continuer le code du fichier GESTION de façon qu'il importe les données du fichier "demandes outillages" mais également les données du fichier "Suivi outillages".
Le code fonctionne mais serait-il possible de me dire si ma structure est bonne ou bien peut-il être simplifié.
Merci
Sub Importation_Demandes()
Dim F_DO As String
Dim tbSource As ListObject, tbDest As ListObject
'on bloque l'ecran
Application.ScreenUpdating = False
' Chemin du classeur "Demande outillage"
F_DO = "C:\Users\apalo\Desktop\ODP\Demandes outillages.xlsm"
' Ouvrir le classeur "Demandes outillages"
Workbooks.Open Filename:=F_DO
Set tbSource = Workbooks("Demandes outillages.xlsm").Sheets("Demandes outillages").ListObjects(1)
Set tbDest = ThisWorkbook.Sheets("Charge").ListObjects(1)
tbSource.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "Demandes outillages"
tbDest.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "CHARGE"
Dim i As Integer, lig As Integer
Dim j As Byte
For i = 1 To tbSource.ListRows.Count
On Error Resume Next
lig = WorksheetFunction.Match(tbSource.DataBodyRange(i, 1).Value, tbDest.ListColumns(1).DataBodyRange.Value, 0)
If lig > 0 Then 'cas mise a jour de donnees si existantes en feuille Charge
With tbDest.DataBodyRange
For j = 3 To 18 'remise a jour des colonnes C a R
.Item(lig, j) = tbSource.DataBodyRange(i, j).Value
Next j
End With
Else: 'cas ajout ligne de donnees si non existantes en feuille Charge
With tbDest
If .ListRows.Count = 0 Then
.ListRows.Add: lig = 1
Else: .ListRows.Add: lig = .ListRows.Count
End If
With .DataBodyRange
For j = 1 To 18 'ajout nouvelles donnees des colonnes A a R
.Item(lig, j) = tbSource.DataBodyRange(i, j).Value 'ajoute des donnees colonnes A a R
Next j
End With
End With
End If
On Error GoTo 0
lig = 0
Next i
'Importation des données du fichier suivi outillages dans le fichier gestion
Dim tbSource2 As ListObject ' Test
' Chemin du classeur "Suivi outillages"
F_SO = "C:\Users\apalo\Desktop\ODP\Suivi outillages.xlsm"
' Ouvrir le classeur "Demandes outillages"
Workbooks.Open Filename:=F_SO
Set tbSource2 = Workbooks("Suivi outillages.xlsm").Sheets("Avancement outillages").ListObjects(1)
Set tbDest = ThisWorkbook.Sheets("Charge").ListObjects(1)
tbSource2.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "Demandes outillages" 'Test
'on bloque l'ecran
Application.ScreenUpdating = False
For i = 1 To tbSource2.ListRows.Count
On Error Resume Next
lig = WorksheetFunction.Match(tbSource2.DataBodyRange(i, 1).Value, tbDest.ListColumns(1).DataBodyRange.Value, 0)
If lig > 0 Then 'cas mise a jour de donnees si existantes en feuille Suivi outillages
With tbDest.DataBodyRange
.Item(lig, 31) = tbSource2.DataBodyRange(i, 28).Value 'Mise à jour de la colonne AE du tableau Gestion suivant la colonne AB du tableau Suivi outillages
.Item(lig, 32) = tbSource2.DataBodyRange(i, 30).Value 'Mise à jour de la colonne AF du tableau Gestion suivant la colonne AD du tableau Suivi outillages
.Item(lig, 33) = tbSource2.DataBodyRange(i, 31).Value 'Mise à jour de la colonne AG du tableau Gestion suivant la colonne AE du tableau Suivi outillages
.Item(lig, 34) = tbSource2.DataBodyRange(i, 32).Value 'Mise à jour de la colonne AH du tableau Gestion suivant la colonne AF du tableau Suivi outillages
.Item(lig, 35) = tbSource2.DataBodyRange(i, 29).Value 'Mise à jour de la colonne AI du tableau Gestion suivant la colonne AC du tableau Suivi outillages
End With
End If
On Error GoTo 0
lig = 0
Next i
'Fermer le fichier "Demandes outillages" sans l'enregistrer
Workbooks("Demandes outillages.xlsm").Close savechanges:=False
'Fermer le fichier "Suivi outillages" sans l'enregistrer
Workbooks("Suivi outillages.xlsm").Close savechanges:=False
End SubBonjour
Le code fonctionne mais serait-il possible de me dire si ma structure est bonne ou bien peut-il être simplifié.
Que voulez-vous dire ?
Si vous voulez exécuter les deux codes, ne rassemblez surtout pas les deux codes. Il vaut deux petits codes qu'un grand.
Puis mettre un 2 dans le nouveau code est inutile --> exemple ici :
Dim tbSource2 As ListObjectFaites plutôt comme ceci -->
Comme le deuxième code exporte les donnes depuis Gestion vers Suivi, allez à la fin du code "Importation demandes" et mettez cette ligne juste avant le END SUB,
Call export_donnees()Ce sera nettement plus clair. Et vous gardez toujours la possibilité d'exécuter le code "export_donnees" seul
Bonjour Dan,
Je dois mal je faire comprendre et j'ai donc réalisé un fichier explicatif.
J'ai du mal à saisir comme lier le code importation et celui que tu me conseil de réaliser
Call export_données()
Merci pour ton aide.
Bonjour
Le code export données, envoie les données depuis le fichier gestion vers le fichier suivi
Là je pense que j'ai mal compris votre demande en ce sens que le fichier source c'est le suivi outillages et le fichier dest c'est le fichier gestion
mais ici --> https://forum.excel-pratique.com/s/goto/1162931
Vous écrivez
Ce que je voulais d’abord faire c’est du fichier Gestion vers le fichier suivi.
Dans le fichier gestion, les codes
- Importation des demandes : on importe dans gestion depuis le fichier outillage
- export données : on exporte les données depuis Gestion vers le fichier suivi
Correct ou pas ?
Edit : au vu de votre fichier PDF, je pense que c'est ceci que vous voulez dans le fichier gestion
1. Importer les infos depuis demandes Outillages (colonnes A à R)
2. importer les infos depuis suivi outillages (colonnes AE à AI)
Comme je l'ai mis dans le PDF :
1) Macro appartenant au fichier Gestion.
Elle doit importer et mettre à jour les infos des colonnes A à R du fichier "Demande outillages" dans le fichier "Gestion"
Mais également importer et mettre à jour les infos des colonnes AB à AF du fichier "Suivi outillages" dans le fichier "Gestion"
2) Macro appartenant au fichier Suivi outillages.
Elle doit importer et mettre à jour les infos des colonnes A à U , X, AJ, AB, AC et AD du fichier "Gestion" dans le fichier "Suivi outillages"
3) Macro appartenant au fichier Demandes outillages.
Elle doit importer et mettre à jour les infos des colonnes AD, AF à AH et AC du fichier "Gestion" dans le fichier "Demandes outillages"
re,
1) Macro appartenant au fichier Gestion.
Pour ce point le code Sub Importation_Demandes() est bon
Vous devez juste remplacer CALL EXPORT_DONNEES que je vous avais donné dans un poste précédent par ceci
Call importation_suiviPour rappel, cela doit être placé juste avant le END SUB
Ensuite, dans le même module de votre fichier Gestion, ajoutez le code ci-dessous
Sub importation_suivi()
Dim F_SO As String
Dim tbSource As ListObject, tbDest As ListObject
Dim fichier As String
fichier = "Suivi-outillages.xlsm"
F_SO = "C:\Users\apalo\Desktop\ODP\" & fichier ' Chemin du classeur "Suivi outillage"
' Ouvrir le classeur "Suivi outillages"
Workbooks.Open Filename:=F_SO
Set tbDest = ThisWorkbook.Sheets("CHARGE").ListObjects(1)
Set tbSource = Workbooks(fichier).Sheets("Avancement outillages").ListObjects(1)
tbSource.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "Suivi outillages"
tbDest.AutoFilter.ShowAllData 'Annule tous les filtres automatiques du tableau "CHARGE"
Dim i As Integer, lig As Integer
For i = 1 To tbSource.ListRows.Count
On Error Resume Next 'gestion erreur sur variable lig
lig = WorksheetFunction.Match(tbSource.DataBodyRange(i, 1).Value, tbDest.ListColumns(1).DataBodyRange.Value, 0)
If lig > 0 Then 'cas mise a jour de donnees si numero identification est dans le fichier suivi outillage
With tbDest.DataBodyRange
.Item(lig, 31) = tbSource.DataBodyRange(i, 28).Value 'Validation de saisie des données
.Item(lig, 32) = tbSource.DataBodyRange(i, 30).Value 'commentaire methode
.Item(lig, 33) = tbSource.DataBodyRange(i, 31).Value 'IDG outillages
.Item(lig, 34) = tbSource.DataBodyRange(i, 32).Value 'Founisseur
.Item(lig, 35) = tbSource.DataBodyRange(i, 29).Value 'Prix achat
End With
End If
On Error GoTo 0
lig = 0 'remettre variable à 0
Next i
'Fermer le fichier "suivi outillages" et enregistrer
Workbooks(fichier).Close savechanges:=True
End SubFaites un test.
Le code export_donnees est à supprimer du fichier Gestion bien entendu
Après je passerai aux codes nécessaires pour réaliser le point (2) --> Macro appartenant au fichier Suivi outillages.