XL 2013 Macro pour ajouter des données dans un tableau

bastienb

XLDnaute Nouveau
Bonjour a tous,

Avant tout, je m'excuse si je n'utilise pas les bons mots. Aussi, je débute en macro.
J'espère que mes explications seront claires

Je suis en train de créer un outil Excel de calcul de valeur calorique.
J'ai une feuille "Caloric value", "data", "Europe" et "USA". Data, Europ et USA seront au final cachés aux utilisateurs.
Sur Caloric value, il ya un tableau a compléter pour ajouter un nouvel ingrédient dans la base de données. Une première ligne (plage de cellule nommée europe) pour ajouter des ingrédients dans la base de données Europe et une seconde ligne (plage de cellule nommée usa) pour ajouter des ingrédients dans la base de données USA.
Les bases de données de valeur calorique sont respectivement contenues dans les feuilles Europe et USA.
Sur les feuilles Europe et USA, les bases de données sont contenues dans des tableaux (j'ai défini un tableau en faisant Insertion/tableau).

Voilà ce que j'essaie de faire :
Lorsque quelqu'un rentre des valeurs dans le tableau dans Caloric value, je voudrais créer une macro permettant :
- Copier les valeurs ajoutées s’il y en a dans la ligne Europe et/ou USA
- Ajouter une ligne dans les tableaux des bases de données Europe et/ou USA si il y a quelque chose qui a été complété dans la ligne Europe et/ou USA
- Coller les valeurs dans la base de données Europe et/ou USA s'il y a des données complétées dans les lignes Europe et/ou USA

Comme je vous le disais, je débute donc j'y vais a tâtons et je suis en train de construire mon code

J'ai trouvé comment copier du texte et coller en collage spécial les valeurs copiées (sans tenir compte de la mise en forme).
Code:
Sheets("Caloric Value").Range("C9:T9").Copy
Sheets("Caloric Value").Range("C10:T10").Copy
Je pense que ça passerait aussi comme ça, mais j'ai un doute
Code:
Sheets("Caloric Value").Range("europe").Copy
Sheets("Caloric Value").Range("usa").Copy
Par contre je n'arrive pas trouvé comment coder la condition de copie si la plage de cellule europe et/ou usa est complété. ça peut etre aussi conditionné a fait de completer juste une cellule de la,luigne europe ou usa

Code:
Sheets("Europe").Range("A19").PasteSpecial Paste:=xlPasteValues
Sheets("USA").Range("A19").PasteSpecial Paste:=xlPasteValues
Ici, j'ai mis A9 mais en fait le copier doit se faire sur la ligne qu'on va ajouter dans les bases de données (j'explique ci dessous, c'est la que je bloque entre autre).

J'ai trouvé comment ajouter une ligne a mon tableau sur la base de donnée Europe et USA.
VB:
Sheets("Europe").ListObjects("Tableau1").ListRows.Add
Sheets("USA").ListObjects("Tableau13").ListRows.Add

Ce que je n'arrive pas à coder (j'ai cherché pas mal sur le net, sans succès), c'est faire le collage spécifiquement sur la dernière ligne du tableau dans la base de données Europe ou USA (celle qu'on vient d'ajouter).

Je vous remercie par avance pour votre aide. Si besoin, je peux vous uploader mon fichier.
Bastien
 
Solution
Une variable Range s'utilise directement comme expression Range.
RngEurope.PasteSpecial Paste:=xlPasteValues
Édition: Moi je préfèrerais :
RngEurope.Resize(, 16).Value = Sheets("Caloric Value").Range("europe").Value

don_pets

XLDnaute Occasionnel
Hello,

si tu veux copier sur la dernière ligne d'une feuille :
VB:
sheets(2).Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial Paste:=xlPasteAll, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False

Ici dans l'exemple ça viendra coller sur la dernière ligne remplie de la première colonne de la deuxième feuille
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Récupérez dans une variable Range la plage couverte par le ListRow de la ligne ajoutée. Je je fait toujours, c'est très pratique, aussi bien pour affecter à sa Value un tableau des valeurs de la ligne que pour y coller quelque chose.
VB:
Dim RgnEurope As Range
Set RngEurope = Sheets("Europe").ListObjects("Tableau1").ListRows.Add.Range
 

MFoxy

XLDnaute Nouveau
Bonjour Dranreb,

J'utilise une notation proche de la vôtre, mais qui me permet de m'affranchir de la feuilles, ainsi en cas de renommage de l'onglet ou move du listObject sur une autre feuille du classeur, je ne rencontre pas de souci

Par exemple, pour reprendre votre code,

VB:
Dim RgnEurope As Range
Set RngEurope = Range("Tableau1").Listobject. ListRows.Add
 

bastienb

XLDnaute Nouveau
Hello
Merci pour vos réponses

Désolé don-pets mais en fait mon tableau1 a une ligne de somme juste en dessous donc je ne crois pas que votre solution soit la bonne.

J'ai tester ta solution Dranreb, ça semble fonctionner mais j'ai un bug sur le collage dans le range "RngEurope". J'ai une "erreur d'execution '1004':" "Erreur définie par l'application ou par l'objet".
voici mon code. J'y ai ajouté une ligne a la fin pour purger le tableau sur la feuille caloric value et qu'il soit pret à acceuillir de nouvelles data à ajouter.
J'ai bien une ligne de creer dans mon tableau 1.
Le debogage surligne la ligne "
Sheets("Europe").Range("RngEurope").PasteSpecial Paste:=xlPasteValues"

VB:
Sub new_ingredient_europe()

' new_ingredient_europe Macro
' nouvelle ingrédient europe

Sheets("Caloric Value").Range("europe").Copy

Dim RgnEurope As Range
Set RngEurope = Sheets("Europe").ListObjects("Tableau1").ListRows.Add.Range

Sheets("Europe").Range("RngEurope").PasteSpecial Paste:=xlPasteValues

Sheets("Caloric Value").Range("europe").FormulaR1C1 = ""


End Sub

Je ne sais aps si ça a de l'importance mais mon tableau de depart n'a pas le même nombre de colonne que le tableau d'arrivée, cad, le groupe de cellule nommé europe sur la feuille "Caloric Value" contient 16 cellules sur 1 ligne tandis que le groupe RngEurope creer lors de l'ajout d'une ligne dans le Tableau 1 va contenir 24 cellules sur 1 ligne (les 16 a reporter + 16 autre qui sont des calculs basé sur les 16 premières).
 

Dranreb

XLDnaute Barbatruc
Une variable Range s'utilise directement comme expression Range.
RngEurope.PasteSpecial Paste:=xlPasteValues
Édition: Moi je préfèrerais :
RngEurope.Resize(, 16).Value = Sheets("Caloric Value").Range("europe").Value
 
Dernière édition:

bastienb

XLDnaute Nouveau
Yes, ça marche.
La seconde solution a été la bonne " RngEurope.Resize(, 16).Value = Sheets("Caloric Value").Range("europe").Value ", l'autre ne fonctionnait pas.
Juste pour etre sur de comprendre ce bou de code, on redimentionne Rng Europe a 16 case et on lui applique le range europe. c'est ça?
Bonne fin de journée
Bastien
 

Discussions similaires

Statistiques des forums

Discussions
292 799
Messages
1 926 350
Membres
183 036
dernier inscrit
Valère Rousseau