[RESOLU] Copie de données d'une plage de données vers un tableau

Akortys

XLDnaute Occasionnel
Bonjour à tous,

Je cherche a faire en macro les actions suivantes.

Dans le gestionnaire de noms :
Une plage de données nommée : Référence
Un tableau nommé : Tableau2

Je cherche à copier les données de ma plage "Référence" vers Tableau2.
Sachant que Tableau 2 possède plus de colonne de plus que Référence, et une ligne vide en ligne 1 (une ligne en plus au début quoi).


Cette colonne supplémentaire me permet de faire un calcul pour une restitution de données.

En vous remerciant par avance.

@+:confused:
 
Dernière édition:

chris

XLDnaute Barbatruc
Re : Copie de données d'une plage de données vers un tableau

Bonjour

Un code qui utilise les propriétés Tableau
  • partant du principe qu'on dynamise le nom de la feuille qui le porte
  • que Référence a une ligne d'entête
  • que Tableau2 (je conseille un nom plus explicite) peut ou non avoir la ligne de sous totaux activée
Code:
Dim maplage As Range, x As Long, Tot As Boolean

    Set maplage = Range("Référence").Offset(1, 0).Resize(Range("Référence").Rows.Count - 1, Range("Référence").Columns.Count)
    
    With Worksheets(Range("Tableau2").Parent.Name)
        x = .ListObjects("Tableau2").ListRows.Count
        Tot = .ListObjects("Tableau2").ShowTotals
        If Tot = True Then .ListObjects("Tableau2").ShowTotals = False
        maplage.Copy Destination:=.Cells(x + 2, 1)
        If Tot = True Then .ListObjects("Tableau2").ShowTotals = True
    End With
 
Dernière édition:

Akortys

XLDnaute Occasionnel
Re : Copie de données d'une plage de données vers un tableau

Merci Chris,

Mais pour moi ca ne fonctionne pas j'ai un message d'erreur 1004 :
La méthode 'Range' de l'objet '_Global' a échoué.

erreur sur :
Set maplage = Range("brut").Offset(1, 0).Resize(Range("brut").Rows.Count - 1, Range("brut").Columns.Count)

De plus connais-tu le moyen de renommer mon tableau2 ?

Merci d'avance
 

chris

XLDnaute Barbatruc
Re : Copie de données d'une plage de données vers un tableau

Bonjour

Ta plage s'appelle Référence ou brut ?

As-tu déclaré la variable maplage ?

Pour renommer un tableau, on peut, soit passer par le gestionnaire de noms, soit plus simplement dans le ruban, dans l'onglet Tableau, création, modifier le nom à gauche.
 

Akortys

XLDnaute Occasionnel
Re : Copie de données d'une plage de données vers un tableau

Ok pour le renommage de tableau2, il suffisait de regarder un peu mais qd on ne voit rien c'est pas facile.

Ma plage s'appelle brut j'avais mis Référence mais cela ne change rien.
Dans le code fournit j'ai remplacer 'Référence' par 'brut'.

Oui la plage est déclarée comme suit :
Dim maplage As Range, x As Long, Tot As Boolean

Set maplage = Range("brut").Offset(1, 0).Resize(Range("brut").Rows.Count - 1, Range("brut").Columns.Count)

With Worksheets(Range("Tableau2").Parent.Name)
x = .ListObjects("Tableau2").ListRows.Count
Tot = .ListObjects("Tableau2").ShowTotals
If Tot = True Then .ListObjects("Tableau2").ShowTotals = False
maplage.Copy Destination:=.Cells(x + 1, 1)
If Tot = True Then .ListObjects("Tableau2").ShowTotals = True
End With
 

chris

XLDnaute Barbatruc
Re : Copie de données d'une plage de données vers un tableau

Re

Pas de problème de majuscule/minuscule dans les noms ? Attention la ligne Set maplage est continue : pas de retour à la ligne.

Une petite faute de frappe (de ma part) à corriger x+2 et non x+1 (je mets le code à jour)

Sinon mets ton fichier ou un extrait : chez moi cela fonctionne. Je ne pense pas qu'il y ait une différence entre 2007 et 2010 mais on ne sait jamais...
 

Akortys

XLDnaute Occasionnel
Re : Copie de données d'une plage de données vers un tableau

Ok Chris,

Ça fonctionne presque comme je le souhaite.

J'ai identifié le pb qu'il y a avait. En fait, la feuille avec la plage de données Brut doit être activée. Si je suis sur le Tableau2 j'ai le message d'erreur en question.
Dans mon code j'ajouterais :
Sheets("brut").Select
ou
Worksheets("brut").Activate

Sachant que ma feuille brut contient la plage de données brut.

Par contre il me colle les données à la suite des données existantes. Existe-t-il un moyen pour supprimer les données du Tableau2 avant de coller les données de Brut ?
Sans effacer les colonnes supplémentaires par rapport à la plage de données brut.

Merci d'avance
 
Dernière édition:

chris

XLDnaute Barbatruc
Re : Copie de données d'une plage de données vers un tableau

RE

Si le code est dans un module, la feuille n'a pas besoin d'être activée. Où est placé le code ?

Si tu travailles avec plusieurs Classeurs il faut ajouter la référence au classeur concerné...

Code:
Sub test()

Dim maplage As Range, x As Long, Tot As Boolean

    Set maplage = Range("Brut").Offset(1, 0).Resize(Range("Brut").Rows.Count - 1, Range("Brut").Columns.Count)
    
    With Worksheets(Range("Tableau2").Parent.Name)
        x = .ListObjects("Tableau2").ListRows.Count
        .Rows("2:" & x).Delete Shift:=xlUp
        x = .ListObjects("Tableau2").ListRows.Count
        maplage.Copy Destination:=.Cells(x + 1, 1)
    End With

End Sub

Il est toujours bien de préciser toutes les données du problème dès le début...
 

Akortys

XLDnaute Occasionnel
Re : Copie de données d'une plage de données vers un tableau

RE

Un seul classeur et le code est dans un module (le module4 mais on s'en fout :) )

Si je ne mets pas Worksheets("brut").Activate cela ne fonctionne pas pour ma part.

Et en mettant le dernier code :
Sub test()

Dim maplage As Range, x As Long, Tot As Boolean
Worksheets("brut").Activate
Set maplage = Range("brut").Offset(1, 0).Resize(Range("brut").Rows.Count - 1, Range("brut").Columns.Count)

With Worksheets(Range("Tableau2").Parent.Name)
x = .ListObjects("Tableau2").ListRows.Count
.Rows("2:" & x).Delete Shift:=xlUp
x = .ListObjects("Tableau2").ListRows.Count
maplage.Copy Destination:=.Cells(x + 1, 1)
End With

End Sub
J'ai une erreur a la ligne :
.Rows("2:" & x).Delete Shift:=xlUp

La méthode delete de la classe range a échoué.
 

chris

XLDnaute Barbatruc
Re : Copie de données d'une plage de données vers un tableau

Re

Peux-tu joindre ton fichier ou un extrait ? Eventuellement lien par MP si c'est confidentiel...

A priori je déduis que le nom Brut à une portée feuille et non classeur et/ou que ton tableau ne démarre pas en ligne 1 mais je préfère tester sur du concret...
 

Akortys

XLDnaute Occasionnel
Re : Copie de données d'une plage de données vers un tableau

RE

Voici le fichier avec les données modifiées
macro1 qui fonctionne mais ne supprime pas les données de donneesfour
test qui plante sur le delete

La colonne DT du tableau DonnesFour doit conserver sa formule.
Le format du tableau doit être également conservé ( colonne DT, ligne 1 vide, ...)

Merci d'avance pour l'aide.
 

Pièces jointes

  • TEST.xls
    515 KB · Affichages: 49
  • TEST.xls
    515 KB · Affichages: 49
  • TEST.xls
    515 KB · Affichages: 46
Dernière édition:

chris

XLDnaute Barbatruc
Re : Copie de données d'une plage de données vers un tableau

Bonjour

J'avais bien deviné :
  • brut avait une portée feuille et non classeur : ce qui expliquait l'obligation du activate.
  • le tableau ne démarre par en ligne 1
Par ailleurs il ne faut pas que la plage nommée brut intègre des lignes vides sinon l'intérêt de nommer la plage est quasi nul et d'autant plus si le but est de la copier vers un Tableau.
Utilise une formule à base de DECALER si tu veux un nom dynamique ou bien autant que le code n'utilise pas le nom...

Le code modifié pour fonctionner quelle que soit la ligne et la colonne où commence le tableau : je pars du principe qu'on peut supprimer les lignes (pas d'autre élément sur l'onglet)

A toi de redéfinir ton nom brut (supprime et recrée).
Il est préférable d'enregistrer en format 2007+ (xlsm) quand on manipule des tableaux

Code:
Option Explicit
Sub test()

Dim maplage As Range, x As Long, y As Long, z As Integer
Set maplage = Range("brut").Offset(1, 0).Resize(Range("brut").Rows.Count - 1, Range("brut").Columns.Count)

With Worksheets(Range("DonneesFour").Parent.Name)
    y = .ListObjects("DonneesFour").Range.Row + 1
    z = .ListObjects("DonneesFour").Range.Column
    x = .ListObjects("DonneesFour").ListRows.Count + y - 1
    
    .Rows(y & ":" & x).Delete Shift:=xlUp
    x = .ListObjects("DonneesFour").ListRows.Count + y
    maplage.Copy Destination:=.Cells(x, z)
End With

End Sub
 

Akortys

XLDnaute Occasionnel
Re : Copie de données d'une plage de données vers un tableau

Bonjour Chris,

Impeccable cela fonctionne à 98% comme je le souhaitais.

Les 2% restants sont liés à la redéfinition de brut qui me pose un souci car mon modèle de fichier brut n'existe pas. C'est donc lors de l'export de mes données que brut est définit, et il a une portée feuille.
Si je veux que cela fonctionne je suis obligé de faire comme tu l'as indiqué c'est à dire supprimer ce "brut" et le recréer en ayant une portée classeur.

Je vais essayer de le faire sous forme de macro mais je ne suis pas sûr que cela fonctionne et de plus que la macro me permette de conserver l'aspect variable de mon export.

Cordialement

Akortys
 

Discussions similaires

Statistiques des forums

Discussions
312 101
Messages
2 085 297
Membres
102 856
dernier inscrit
primavera49