Actualisation d'un tableau puis recopie vers une autre feuille

Bonjour a tous,

Cela fait à présent quelques jour que je bloque sur mon problème alors je me décide a venir vous en parler. Je dispose d'un tableau dans lequel il a y a différentes données, je souhaite recopier certaines colonnes sur une autre feuilles, jusque la tout va bien. Ce que je n'arrive pas à faire c'est, quand une information est rajoutée après la recopie du tableau, celle ci s'actualise dans le deuxième tableau sans décaler certaines colonnes qui, elles ne sont pas recopiées d'un tableau a l'autre.

J'espère avoir été clair dans mes explications

Voici mon code:

Sub copie_tableau()
Application.EnableEvents = False
With Worksheets("Feuil1")                             

.Range("A2:A114").Copy Worksheets("Feuil2").Range("A6")
.Range("D2:D114").Copy Worksheets("Feuil2").Range("F6")
.Range("G2:G114").Copy Worksheets("Feuil2").Range("B6")
.Range("R2:R114").Copy Worksheets("Feuil2").Range("C6")
.Range("Z2:Z114").Copy Worksheets("Feuil2").Range("D6")

End With                                               
Application.EnableEvents = True

End Sub

Pouvez vous me venir en aide ?

Merci beaucoup

Bonjour a tous,

Cela fait à présent quelques jour que je bloque sur mon problème alors je me décide a venir vous en parler. Je dispose d'un tableau dans lequel il a y a différentes données, je souhaite recopier certaines colonnes sur une autre feuilles, jusque la tout va bien. Ce que je n'arrive pas à faire c'est, quand une information est rajoutée après la recopie du tableau, celle ci s'actualise dans le deuxième tableau sans décaler certaines colonnes qui, elles ne sont pas recopiées d'un tableau a l'autre.

J'espère avoir été clair dans mes explications

Voici mon code:

Sub copie_tableau()
Application.EnableEvents = False
With Worksheets("Feuil1")                             

.Range("A2:A114").Copy Worksheets("Feuil2").Range("A6")
.Range("D2:D114").Copy Worksheets("Feuil2").Range("F6")
.Range("G2:G114").Copy Worksheets("Feuil2").Range("B6")
.Range("R2:R114").Copy Worksheets("Feuil2").Range("C6")
.Range("Z2:Z114").Copy Worksheets("Feuil2").Range("D6")

End With                                               
Application.EnableEvents = True

End Sub

Pouvez vous me venir en aide ?

Merci beaucoup

Bonjour,

En clair, après ajout de données, la plage à copier n'est plus "A2:A114" ? Si c'est ça le problème, tu peux d'abord déterminer la position de la dernière ligne, puis dimensionner ta copie jusqu'à celle-ci.

Exemple :

LigMax = .Range("A" & .Rows.Count).End(xlUp).Row
.Range("A2:A" & LigMax).Copy Worksheets("Feuil2").Range("A6")

La plage de A2 à A114 est un peu grande mais c'est pour avoir de la marge car je ne sais pas comment faire pour copier le tableau avec une taille variable. Mais le problème c'est surtout que certaines colonnes, quand on y insère des données supplémentaires, font descendre les données d'une case. Et ce qu'il y a c'est que une case qui est a coté ne suivra pas la case descendu qui lui correspond ce qui fait que les informations seront décalées et donc fausses. Ce que je cherche a faire c'est donc de faire descendre tout le tableau en dessous de la ligne actualisé.

La plage de A2 à A114 est un peu grande mais c'est pour avoir de la marge car je ne sais pas comment faire pour copier le tableau avec une taille variable. Mais le problème c'est surtout que certaines colonnes, quand on y insère des données supplémentaires, font descendre les données d'une case. Et ce qu'il y a c'est que une case qui est a coté ne suivra pas la case descendu qui lui correspond ce qui fait que les informations seront décalées et donc fausses. Ce que je cherche a faire c'est donc de faire descendre tout le tableau en dessous de la ligne actualisé.

C'est toujours pas très clair (peut-être qu'un fichier nous aiderais), y'a-t-il un rapport avec l'extrait de code que tu nous as transmis ?

De ce que je comprends, l'ajout de données se fait par insertion de ligne, idéalement dans un tableau structuré.

Voila mon fichier. Le problème se trouve sur la feuille n°2. Quand on rentre des informations dans la colonne "type de matériel", que l'on rajoute une ligne dans le premier tableau et que l'on fait "copie tableau" la ligne rajoutée dans le deuxième tableau précédemment ne descend pas d'une case et ne suit pas la ligne à laquelle elle correspond

9prd-sylob.xlsm (44.04 Ko)

Voila mon fichier. Le problème se trouve sur la feuille n°2. Quand on rentre des informations dans la colonne "type de matériel", que l'on rajoute une ligne dans le premier tableau et que l'on fait "copie tableau" la ligne rajoutée dans le deuxième tableau précédemment ne descend pas d'une case et ne suit pas la ligne à laquelle elle correspond

PRD sylob.xlsm

Je crois que je commence à comprendre... Si je récapitule :

  • Tu crées un tableau à partir d'un export partiel d'une base de données.
  • Ta ajoutes des informations dans ce nouveau tableau
  • Lorsque tu modifies ta base de données et que tu génères à nouveau un export partiel, les données précédemment saisies se trouvent décalées dans ton tableau, c'est ça ?

Il faudrait que tu ajoutes quelque part un identifiant unique. Ensuite, plutôt que de faire un copier/coller d'une plage complète, il faudrait parcourir les lignes une à une et se baser sur le n° unique pour reporter les exporter les valeurs. Exemple :

Sub copie_tableau()

Dim LigMax As Long, LigMax2 As Long, Indice As Long, Lig As Long, IDunique As String, Position As Variant

With Sheets("Feuil1")                             
   LigMax = .Range("A" & .Rows.Count).End(xlUp).Row 'Détermine la dernière ligne (feuille 1)
   For Lig = 2 To LigMax 'Parcourir les lignes du tableau 1 (feuille 1)
      IDunique = .Range("A" & Lig)
      If Not IDunique = "" Then
         LigMax2 = Sheets("Feuil2").Range("B" & Rows.Count).End(xlUp).Row 'Détermine la dernière ligne (feuille 2)
         Set Position = Sheets("Feuil2").Range("A2:A" & LigMax2).Find(IDunique, LookIn:=xlValues, LookAt:=xlWhole) 'Recherche de l'ID unique
         If Position Is Nothing Then Indice = LigMax + 1 Else Indice = Position.Row 'Ecriture sur une nvlle ligne si l'ID unique n'est pas présent
         Sheets("Feuil2").Range("A" & Indice) = IDunique
         Sheets("Feuil2").Range("B" & Indice) = .Range("B" & Lig)
         Sheets("Feuil2").Range("C" & Indice) = .Range("H" & Lig)
         Sheets("Feuil2").Range("D" & Indice) = .Range("S" & Lig)
         Sheets("Feuil2").Range("E" & Indice) = .Range("AA" & Lig)
         Sheets("Feuil2").Range("G" & Indice) = .Range("E" & Lig)
      End If
   Next Lig
End With                                               

End Sub

Bonjour,

ce que tu as expliqué est exactement mon problème mais en mieux dit toutefois j'ai essayé de prendre ce que tu avais fait mais du coup cela ne copie plus rien du tout

Bonjour,

ce que tu as expliqué est exactement mon problème mais en mieux dit toutefois j'ai essayé de prendre ce que tu avais fait mais du coup cela ne copie plus rien du tout

Mon exemple se base sur l'ajout d'un colonne en A dans les 2 tableaux. L'identifiant unique est à mettre dans cette colonne...

Peut tu m'expliquer comment faire ? parce que je suis un peu perdu et je ne sais pas trop comment faire

Peut tu m'expliquer comment faire ? parce que je suis un peu perdu et je ne sais pas trop comment faire

Peu importe ce que tu mets en colonne A, du moment que tu n'as pas de doublons. Le principe est d'y mettre une valeur unique, qui est reportée en tableau 2 en face des mêmes lignes. Ainsi, lorsque l'ordre de l'un des tableaux est modifié, cette valeur permet à la macro de retrouver la position respective de chaque ligne.

Ca peut-être par exemple : "Cmd001", "Cmd002"...

Pourrais tu me mettre dans le code que tu m'as envoyé les endroits en commentaire ou il faut adapter les trucs stp ?

Merci beaucoup

Pourrais tu me mettre dans le code que tu m'as envoyé les endroits en commentaire ou il faut adapter les trucs stp ?

Merci beaucoup

Bonjour,

En dehors peut-être du nom des feuilles, il n'y a rien à changer dans le code (qui, au passage, est déjà commenté...). Je vois difficilement comment être plus explicite :

Il te suffit d'ajouter une colonne avant la colonne A actuelle dans chacun des 2 tableaux. Dans cette colonne, tu ajoutes n'importe quelle valeur ou texte de façon à ce que 2 lignes d'un même tableau n'aient en aucun cas la même valeur. En revanche, les lignes de chaque tableau qui concernent une même donnée doivent avoir strictement le même identifiant.

Du coup avec ce code, je recois dans le deuxième tableau seulement "N° de commande" y a t'il quelque chose de spécial à faire pour afficher les chiffres

Du coup avec ce code, je recois dans le deuxième tableau seulement "N° de commande" y a t'il quelque chose de spécial à faire pour afficher les chiffres

J'ai commenté un peu plus le code, si ça peut t'aider...

Sub copie_tableau()

Dim LigMax As Long, LigMax2 As Long, Indice As Long, Lig As Long, IDunique As String, Position As Variant 'Déclaration des variables utilisées

With Sheets("Feuil1") 'Toute instruction commençant par "." se rattache à cette feuille                             
   LigMax = .Range("A1").CurrentRegion.Rows.Count 'Détermine la dernière ligne (feuille 1)
   For Lig = 2 To LigMax 'Parcourir les lignes du tableau 1 (feuille 1)
      IDunique = .Range("A" & Lig) 'Affecte l'identifiant unique en colonne A à une variable IDunique
      If Not IDunique = "" Then 'Contrôle de la présence d'un ID unique
         LigMax2 = Sheets("Feuil2").Range("A" & Rows.Count).End(xlUp).Row 'Détermine la dernière ligne (feuille 2)
         Set Position = Sheets("Feuil2").Range("A2:A" & LigMax2).Find(IDunique, LookIn:=xlValues, LookAt:=xlWhole) 'Recherche de l'ID unique du tableau 1 dans le tableau 2
         If Position Is Nothing Then Indice = LigMax2 + 1 Else Indice = Position.Row 'Ecriture sur une nvlle ligne si l'ID unique n'est pas présent
         Sheets("Feuil2").Range("A" & Indice) = IDunique 'Report de l'ID unique
         Sheets("Feuil2").Range("B" & Indice) = .Range("B" & Lig) 'Report de la colonne B en col. B de la feuille 2
         Sheets("Feuil2").Range("C" & Indice) = .Range("H" & Lig) 'Report col. H en col. C de la feuille 2
         Sheets("Feuil2").Range("D" & Indice) = .Range("S" & Lig) 'Col. S en D
         Sheets("Feuil2").Range("E" & Indice) = .Range("AA" & Lig) 'Col. AA en E
         Sheets("Feuil2").Range("G" & Indice) = .Range("E" & Lig) 'Col. E en G
      End If
   Next Lig 'Ligne suivante
End With                                               

End Sub

Super, merci je comprend un peu mieux de code du coup mais le problème c'est que cela me recopie seulement une ligne, comment je dois faire pour que cela recopie absolument tout le tableau de la feuille 1 ?

Super, merci je comprend un peu mieux de code du coup mais le problème c'est que cela me recopie seulement une ligne, comment je dois faire pour que cela recopie absolument tout le tableau de la feuille 1 ?

Je n'ai plus en tête l'organisation de ton fichier, mais c'est peut-être cette instruction qui pose problème :

LigMax = .Range("A1").CurrentRegion.Rows.Count

Tente avec :

LigMax = .Range("A" & .Rows.Count).End(xlUp).Row

C'est déjà mieux la ligne se met au début du tableau et plus en bas mais par contre cela ne prend encore qu'une seule ligne :/

C'est déjà mieux la ligne se met au début du tableau et plus en bas mais par contre cela ne prend encore qu'une seule ligne :/

Peux tu joindre le fichier sur lequel tu travailles (et donc sur lequel le problème se pose) ?

Voila le fichier, et en fait ca recopie une ligne mais la met a la fin du tableau et il faut que la colonne A soit copié dans la colonne A de la feuille 2, la colonne D dans la colonne F, la colonne G dans la colonne B et la colonne R dans la colonne C.

2prd-sylob.xlsm (45.27 Ko)

Voila le fichier, et en fait ca recopie une ligne mais la met a la fin du tableau et il faut que la colonne A soit copié dans la colonne A de la feuille 2, la colonne D dans la colonne F, la colonne G dans la colonne B et la colonne R dans la colonne C.

Il est où ton numéro unique dans ce fichier ?

Rechercher des sujets similaires à "actualisation tableau puis recopie feuille"