Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

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

  • test.xlsm
    56.9 KB · Affichages: 140

Jean-Eric

XLDnaute Occasionnel
Re,
Pour ma part, il suffit de rajouter la ligne suivante en fin de procédure (avant la réinitialisation des variables).
VB:
lr.Range.Cells(1, 1).Select
@Marcel32,
Que fait-on sil un en-tête ou des en-têtes de colonnes sont modifiés ?
Cdlt.
 

Mugiwara

XLDnaute Nouveau
Ok merci Marcel et Jean Eric, parfait!!

Je laisse le soin à Marcel32 de te répondre Jean Eric, mais je présume que cela modifie automatiquement le script de la macro en conséquent, c'est tellement bien fait
 

TooFatBoy

XLDnaute Barbatruc
Je laisse le soin à Marcel32 de te répondre Jean Eric, mais je présume que cela modifie automatiquement le script de la macro en conséquent, c'est tellement bien fait
Non, justement c'est bien ce que voulait faire remarquer Jean-Eric, ça ne modifie pas la macro qui du coup ne marche plus.
Et il y a plus de chance qu'une colonne change de nom que de place.
 

troopers87

XLDnaute Occasionnel
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

  • Exemple.xlsm
    23.5 KB · Affichages: 47

Jean-Eric

XLDnaute Occasionnel
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
 

troopers87

XLDnaute Occasionnel
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
 

troopers87

XLDnaute Occasionnel
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".
 

troopers87

XLDnaute Occasionnel
Oui, c'est tout à fait ça

Sauf que si je remplace :
VB:
Set ListRow = Worksheets("Feuil1").ListObjects(1).ListRows.Add

par

VB:
Set ListRow = Worksheets("Feuil1").ListObjects(Tableau1).ListRows.Add

Alors, Excel me remonte l'erreur suivante :

Erreur d'exécution '9':
L'indice n'appartient pas à la sélection.

 

Si...

XLDnaute Barbatruc
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

  • Tableau Syntaxe.xlsm
    33.7 KB · Affichages: 31

troopers87

XLDnaute Occasionnel
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 ?
 

troopers87

XLDnaute Occasionnel
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

  • Exemple.xlsm
    25.3 KB · Affichages: 26

Si...

XLDnaute Barbatruc
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

  • UsF et Tableau (pas Array).xlsm
    21.5 KB · Affichages: 20

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…