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

15gestion.xlsm (26.65 Ko)

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.... pas sûr à voir l'USF réalisée. Mé bon...

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 Sub

Si 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.

11gestion.xlsm (31.61 Ko)

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 Sub

NB : 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 Sub

Bonjour

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 ListObject

Faites 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_suivi

Pour 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 Sub

Faites 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.

Rechercher des sujets similaires à "copier mise jour donnees tableau"