Impossible d'insérer d'un tableau à un autre

Bonjour,

En voilà une bonne, Excel me dit qu'il ne peut pas insérer des lignes d'un tableau (Feuil2) dans un autre(Feuil1) "nous ne pouvons effectuer cette action cela impliquerait le déplacement de cellules de tableau de votre feuille de calcul" Dommage car c'est pile ce que je voulais faire.

Le contexte: J'ai 2 tableaux sur 2 feuilles et j'intègre une série de ligne (au nombre variable) de la feuil2 à la feuille 1. Le copié coller s'effectue à une place bien précise (selon N° de ligne)

Ce week-end, comme le temps est maussade je me suis dit que j'allais modernisé mon tableau et passer par Power Query pour simplifier mon process de création des 2 tableaux en question. jusqu'ici tout va bien.

Ce que je n'avais pas franchement anticipé c'est que la version "tableau" d'Excel ne semble pas permettre "d'insérer des données" issues d'un autre tableau. Cette petite ligne ne marche pas parceque je n'ai plus des données dans des cellules, j'ai un tableau (à cause de power query)

' Les insérer au bon endroit dans la feuille DSN
Sheets("feuille1").Range("A" & LigDSN).Insert Shift:=xlDown

Ma question c'est est ce qu'il est possible de faire "insérer les cellules copiés" dans un tableau Excel?! Je veux dire, sans avoir d'abord à insérer des lignes vides.

Sub IntégrationDansDSN()
  Dim Col As Long, dLigS As Long, LigDSN As Long, Colone As Long, Coltwo As Long
  ' Avec la feuille de saisie
  With Sheets("feuil2")
    ' Pour les colonnes de C=3 à F=6. Compléter D4 et E4
    Colone = Range("D4").Value
    Coltwo = Range("E4").Value
    For Col = Colone To Coltwo
      ' Récupérer le numéro de ligne ou insérer
      LigDSN = .Cells(9, Col)
      ' Dernière ligne du bloc à insérer
      dLigS = .Cells(Rows.Count, Col).End(xlUp).Row
      ' Copier les lignes et les insérer
      .Range(.Cells(11, Col), .Cells(dLigS, Col)).Copy
      ' Les insérer au bon endroit dans la feuille DSN
      Sheets("feuil1").Range("A" & LigDSN).Insert Shift:=xlDown
    Next Col
  End With
End Sub

Par avance Merci

Salut,

Si tu utilises des tableaux structurés alors utilises les à fond, exit les :

.Cells(Rows.Count, Col).End(xlUp).Row

ou les

Sheets("feuil1").Range("A" & LigDSN).Insert Shift:=xlDown

Tu dois utiliser les Objets ListRow de la collection ListRows avec la méthode Add

Sub CopierColler()
Range("Tableau1").Copy Range("Tableau2").ListObject.ListRows.Add.Range.Cells(1)
End Sub

comme ceci ?

bonsoir

comme ton fichier n'est absolument pas représentatif de ta demande
de ce que j'ai compris
si tu veux ajouter les lignes deton tableau2 en debut de liste du tableau1 ALORS!

il va te falloir ajouter autant de lignes en position (1)( le 1 c'est important!!!)
une fois que tu a tes lignes en debut de ton tableau1(qui sont vide pour l'instant) on va y ajouter tes lignes du tableau2
pour cela rien de plus simple on récupère tout le tableau2 (sans l'entête bien sur) dans une variable tableau
et on l'injecte dans la cells(1)du databodyrange resizée a la variable tableau ligne/colonne

Sub AjouteEnDebutDeListe()
    Dim R1 As Range, R2 As Range, Lig&, tablo
    Set R1 = Range("Tableau1")
    Set R2 = Range("Tableau2")
    tablo = R2.Value
    For Lig = 1 To UBound(tablo): R1.ListObject.ListRows.Add (1): Next
    Set R1 = Range("Tableau1")
    R1.Cells(1).Resize(UBound(tablo), UBound(tablo, 2)) = tablo
End Sub

si tu veux ajouter tes lignes du tableau2 a la fin du tableau1
la tu a besoins de presque rien il te suffit d'injecter la variable tableau dans la ligne vide en dessous le tableau1 (il se redimentionne tout seul)

Sub AjouteaLaSuiteDeListe()
    Dim R1 As Range, R2 As Range, tablo
    Set R1 = Range("Tableau1")
    Set R2 = Range("Tableau2")
    tablo = R2.Value
    R1.Cells(R1.Rows.Count + 1,1).Resize(UBound(tablo), UBound(tablo, 2)) = tablo
End Sub

Pour Info

certains feraient

set r1=feuil1.listobjects("Tableau1") 'obligé d'être sur la feulle parent de ce tableau
à la place de
set r1.range("Tableau1").listobject 'on peut être ou on veut

perso même si je travaile mon tableau en listobject je l'attaque d'abords par la collection Range et son nom!!!
tout simplement par ce que un name "Tableau1" ou "Tableau2" il ne peut y en avoir qu'un et ca me permet donc ne ne pas être obligé d'être sur la feuille contenant le tableau

et que range("Tableau1")
donne la même chose que feuil1.listobjects("Tableau1").databodyrange

voila tu sais tout

démonstration

Ajout en debut de liste

demo

Démonstration en fin de liste

demo



patricktoulon

Bon, je me rend bien compte que demander de l'aide sans le fichier c'est pas possible alors voici...ma petite usine .

Le but de ce tableau: insérer des lignes spécifiques au milieu d'une base de donnée.

Etape 1: L'utilisateur fait un copier coller de données dans la première feuille

Etape 2: L'utilisateur va saisir les données à insérer. Je vais déterminer à quel N° de ligne il faut se placer pour insérer les données grace à PowerQuery.

Etape 3: Je nettoie les données à insérer (en enlevant les espaces) pour avoir mes lignes au propre en BlocsE2. Jusqu'ici tout fonctionne.

Etape 4: je saisie la colonne 3 c'est à dire 3 en D4 / ctrl Alt F5 / je clic sur le bouton Insérer / je saisis 4 en D4 / ctrl Alt F5 / insérer... je saisie 150/ctrl Alt F5 / Insérer, jusqu'à ce qu'il n'y ai plus de colonne.

Ok ça semble fastidieux dit comme ça mais vous n'imaginez pas à quel point c'est plus rapide que de faire tout cela ligne par ligne et manuellement. Et je n'ai pas trouvé de meilleur idée pour faire ça.

Aprés chaque insertion, les 2 requêtes Power Query doivent se mettre à jour pour calculer le nouveau numero de ligne ou je dois me positionner pour insérer la colonne suivante.

Comme je le disais, j'ai voulu utiliser PowerQuery pour l'étape 2 plutôt que pleins de feuilles avec pleins de formules. Je voulais le simplifier.

Je ne veux donc pas insérer mes lignes au début ou à la fin mais à une ligne bien spécifique!

Voila. J'ai hâte d'avoir vos remarques et suggestions.

Merci

3versiontest.zip (348.54 Ko)

quelle usine à gaz, c'est quoi l'objectif ?

L'objectif final est en lien avec un fichier qui est transmis chaque mois à l'administration sous forme de .txt et qui regroupes des données sociales.

Pour un individu il y a autour de 250 lignes par mois. Les outils informatiques réalisent ces fichiers mais gèrent très mal les régularisations. Globalement s'il y a une erreur il faut insérer manuellement des lignes correctives dans le fichier.

Si ça concerne 3 ans pour 50 individus avec dans le meilleur des cas 20 lignes de corrections ben tu peux insérer 36000 lignes avec tes petites mimines, sans te tromper et au bon endroit s'il vous plait sinon on recommence tout.

bonsoir

Je ne veux donc pas insérer mes lignes au début ou à la fin mais à une ligne bien spécifique!

et bien dans ma proposition un peu plus haut dans ce topic tu change le "1" pour la ligne ou tu veux commencer à insérer tes new line

voilà

Bonsoir et merci pour vos retours.

J'ai essayé d'adapter la macro proposée par PatrickT mais je ne suis pas un As sur le sujet. J'ai du faire erreur quelque part :-/

1versiontest.zip (348.28 Ko)

Bonsoir

Sub AjouteEnDebutDeListe()
Dim R1 As Range, R2 As Range, Lig&, tablo
Set R1 = Range("Tableau1")
Set R2 = Range("Tableau3_1")
tablo = R2.Value

LigDSN = .Cells(9, Col)' ca c'est quoi ce .cells il est de quelle range et a quoi ca te sert ?????
For Lig = LigDSN To UBound(tablo): R1.ListObject.ListRows.Add (1): Next
Set R1 = Range("Tableau1")
R1.Cells(1).Resize(UBound(tablo), UBound(tablo, 2)) = tablo
End Sub

La question est claire
quelle ligne de quelle tableau va dans quel tableau et a partir de quelle ligne dans le tableau de destination ?????

et essaie d'être clair

Bonjour, finalement j'ai réussi à obtenir ce que je souhaitais en remplaçant les 1.

C'est top merci beaucoup

Rechercher des sujets similaires à "impossible inserer tableau"