VBA: Ajouter une ligne en fin de tableau en reprenant certaines données de la dernière ligne

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Mugiwara

XLDnaute Nouveau
Bonjour,

Bien que trouvé pas mal de sujets sur mon pb, je ne suis pas parvenu à le résoudre. Je m'explique:

Je souhaite constituer une base de données (tableau avec mise en forme) . L'idée est d'avoir un bouton pour diverses actions (ajout de ligne avec certaines infos / ajout de ligne en copiant les infos précédentes) .

En premier lieu je souhaite une macro permettant d'ajouter en fin de tableau, une nouvelle ligne (qui garde la mise en forme tableau) qui doit faire apparaitre et figer dans la 1ère cellule de cette nouvelle ligne, la date du jour (colonne B ds mon fichier) + appliquer la formule de la colonne C + générer un n° en colonne D qui correspond au n° de la ligne précédente (même colonne) auquel on ajouterai 1 (exemple si 6014 en D21, la nouvelle ligne générée devra faire apparaitre en D22 le nombre 6015) + un texte prédéfini en colonne H et laisser le reste des champs vides.

La seconde macro consisterait de la même manière à générer une nouvelle ligne en fin de tableau, toujours avec la notion de date du jour en colonne B, formule en colonne C, texte prédéfini en colonne H, de recopier toutes les autres infos à l'exception des cellules des colonnes I, P, Q et R qui devront rester vides.

J'espère avoir été assez clair pour vous permettre de comprendre mon besoin et ainsi pouvoir m'aider. Je vous remercie par avance, je joins mon ébauche de fichier pour mieux comprendre...
 

Pièces jointes

Bonjour à tous,

Je suis très intéressé par ce sujet car je souhaite simplement ajouter des données au bas d'un tableau nommé.
Cette donnée étant issue d'une textbox, j'ai tenté de reprendre le code proposé par Marcel32 de cette manière :

VB:
Private Sub CommandButton1_Click()

'insertion du nouvelle ville
If Not TextBox_ajout_vehicule = "" Then

    With Sheets("Feuil1").ListObjects("Tableau1")
        .ListRows.Add AlwaysInsert:=True
        .ListColumns("Tableau1").DataBodyRange(.ListRows.Count) = TextBox1.Value 'c'est ici que je dois me tromper ?
    End With

End If

'fermer la fenêtre et vider les données mémoires
Unload Me

End Sub

Je vous joins un fichier d'exemple pour vous aider à mieux saisir mon besoin.

Merci d'avance pour votre aide !
 

Pièces jointes

Bonjour,
Une proposition à étudier.
Cdlt.
Code:
Option Explicit

Dim lo As ListObject

Private Sub UserForm_Initialize()
    Set lo = Worksheets("Feuil1").ListObjects(1)
End Sub

Private Sub CommandButton1_Click()
Dim lr As ListRow
    If Me.TextBox1.Value = "" Then GoTo exit_Handler
    Set lr = lo.ListRows.Add
    lr.Range.Cells(1, 1).Value = Me.TextBox1.Value
exit_Handler:
    Unload Me
End Sub
 
Bonjour Jean-Eric et merci pour ta réponse,

Effectivement, c'est parfaitement fonctionnel et répond totalement à mon besoin : MERCI !
J'aurais besoin de quelques éléments de compréhension :

VB:
    Set lo = Worksheets("Feuil1").ListObjects(1)

Comment Excel peut-il comprendre que ListObjects(1) fait référence à mon tableau nommé "Tableau1" ? Pourrais-je plutôt utiliser le nom du tableau qui sera bien plus explicite pour moi ?

Merci pour ton retour 🙂
 
Ah oui, je comprends, mais comme tu l'imagines, il s'agit d'un exemple destiné à faciliter notre compréhension.

En réalité, le fichier cible contient un grand nombre de tableaux nommés : y'a-t-il la possibilité d'intégrer leur nom ? Par exemple "TABLE_ville".
 
Bon_jour

Ma Syntaxe (simple) en utilisant le nom du Tableau
- supprimer la dernière ligne du tableau (nommé Tbo) qu'elle soit sélectionnée ou pas
[Tbo].Rows([Tbo].Rows.Count).Delete

- supprimer la première ligne du tableau
Rows([Tbo].Row).Delete

- supprimer la ligne sélectionnée du tableau
[Tbo].Rows(ActiveCell.Row - [Tbo].Row + 1).Delete

- différencier les numéros de ligne Onglet/Tableau
ActiveCell(1, 3) = "ligne sélectionnée de la feuille " & ActiveCell.Row & vbLf & _
"ligne sélectionnée du Tableau " & (ActiveCell.Row - [Tbo].Row + 1)


- ajouter une ligne directement sous le tableau (UsF)
[Tbo].Item([Tbo].Rows.Count + 1, 1) = "Truc"
 

Pièces jointes

Bonjour Si,

Merci pour ta contribution ! Ca m'aide énormément !
Avec ça au moins, le code est clair 🙂

Petite question subsidiaire : au lieu d'utiliser le deuxième "1" dans :

VB:
[Tbo].Item([Tbo].Rows.Count + 1, 1) = "Truc"

Comment pourrait-on utiliser le nom de la colonne (en l’occurrence "VILLES" dans notre exemple ?
 
Bonjour à tous,

Je viens finalement de trouver une solution assez stable avec le code suivant :
VB:
Private Sub CommandButton1_Click()

With Sheets("Feuil1").ListObjects("Tableau1")
            'ajout d'une ligne vierge à la fin du tableau
           .ListRows.Add
            'indice dans la feuille, de la ligne correspondant à la première cellule vide du premier champ du tableau
           i = .ListColumns("VILLES").Range.Find("", SearchDirection:=xlNext).Row
            'indice relatif dans l'objet tableau1, de la ligne correspondant à la première cellule vide du premier champ du tableau
           i = i - .HeaderRowRange.Row
            'remplissage ligne
           .ListColumns("VILLES").DataBodyRange.Rows(i).Value = TextBox1.Value   'le génie est là ! ^^
           .ListColumns("KM").DataBodyRange.Rows(i).Value = TextBox2.Value
       End With

'fermer la fenêtre et vider la mémoire
    Unload Me

End Sub

Voilà, je trouve le code très propre et il s'insère très bien dans l'exemple de fichier que je vous joins (utile pour le suivi !).

Petit bémol : si la première colonne n'est pas remplie en même temps que la seconde, alors la macro va insérer les données à partir de la première ligne vide de la première colonne. Ce n'est pas idéal.

Merci à tous pour votre aide ! 🙂
 

Pièces jointes

Re

Dans ton exemple, pour être complet, il y a 2 conditions à respecter : il faut saisir un nom et un nombre.

Dans le fichier exemple joint, elles se traitent aux sorties des saisies avec blocage de la suite ou pas.

Je garde pour la fin ma syntaxe même si tu penses que la tienne est plus simple.

Sais-tu qu'un des nombreux avantage du Tableau est qu'on peut ne pas le référencer (préciser la feuille dans laquelle il figure). Si oui, autant en profiter pour alléger les codes.
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Tableau
Réponses
24
Affichages
1 K
Retour