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: 139

Si...

XLDnaute Barbatruc
Bon_soir

Avec un tel sujet, on peut s'amuser longtemps en utilisant aussi les titres (surtout si on ne fait pas de test *) :

VB:
Private Sub CommandButton1_Click()
    If TextBox1 = "" Then Exit Sub
   [Tableau1[VILLES]].End(xlDown)(2) = TextBox1:   [Tableau1[KM]].End(xlDown)(2) = TextBox2
   Unload Me
End Sub

*Staple, avec ta macro, tu peux empiler combien de lignes vides o_O ?
 

Jean-Eric

XLDnaute Occasionnel
Bonjour,
Une autre proposition.
Cdlt.
VB:
Private Sub CommandButton1_Click()
Dim r As Range
    With Worksheets("Feuil1").ListObjects("Tableau1")
        If .InsertRowRange Is Nothing Then
            'le tableau comporte des donn?es
            Set r = .HeaderRowRange.Cells(1).Offset(.ListRows.Count + 1)
        Else
            'le tableau est vide
            Set r = .InsertRowRange.Cells(1)
        End If
        With r
            .Value = TextBox1
            .Offset(, 1).Value = CDbl(TextBox2)
        End With
    End With
    Unload Me
End Sub
 

Si...

XLDnaute Barbatruc
Re

Hé oui Jean-Eric, on arrive trop souvent d'oublier des contrôles de validation quand on veut compléter un sujet ;).
Par exemple, Staple n'a pas essayé d'ouvrir son formulaire à partir d'un onglet ne le contenant pas et j'ai oublié le cas d'un tableau vide au départ:oops:. Je donne donc une xième proposition
VB:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Cancel = TextBox1 = ""
  If TextBox1 = "" Then Exit Sub
  If [Tableau1[VILLES]].Find(TextBox1, LookAt:=1) Is Nothing Then Exit Sub
  MsgBox " ville déjà présente !", 16, "Saisie invalidée ..."
  TextBox1 = "": Cancel = 1
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  If Not IsNumeric(TextBox2) Then TextBox2 = ""
  Cancel = Not IsNumeric(TextBox2)
End Sub

Private Sub CommandButton1_Click()
  Dim C As Range, L as long
  With [Tableau1]
  L = IIf(.Item(1, 1) = "", 1, .Rows.Count + 1): Set C = .Item(L, 1)
  End With
  C(1, 1) = TextBox1: C(1, 2) = CDbl(TextBox2)
  Unload Me
End Sub
 

Pièces jointes

  • Tableau et Usf.xlsm
    24.6 KB · Affichages: 31
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le forum, le fil

Une possibilité syntaxique autre (4)
VB:
Private Sub CommandButton1_Click() 
If Len(TextBox1) And Len(TextBox2) Then 
With [Tableau1] 
.ListObject.ListRows.Add.Range.Item(1).Resize(, 3) = Array(TextBox1, vbNullString, TextBox2) 
End With 
End If 
Unload Me 
End Sub
 

Si...

XLDnaute Barbatruc
Re

les With … End With pullulent dans la plupart des propositions faites dans ce forum même quand ils sont inutiles : "en user, oui mais pas en abuser !". Certains n'en connaissent pas l'intérêt (même s'ils ne sont pas nocifs avec les . correspondants) :eek:.

La dernière proposition peut se transformer en
VB:
Private Sub CommandButton1_Click()
  If Len(TextBox1) * Len(TextBox2) Then _
      [Tableau1].ListObject.ListRows.Add.Range.Item(1).Resize(, 3) = Array(TextBox1, vbNullString, TextBox2)
  Unload Me
End Sub

Nota : qu'en est-il dans le sujet présenté quand on démarre avec un tableau vide sans les tests de validité des saisies ?
 

Staple1600

XLDnaute Barbatruc
Re,

La macro du message#35 sans le With/End With et sans le If/End If.
Sur ce PC-ci cela fonctionne, ce qui n'était pas le cas sur le PC* du message#35
(*Et j'ignore pourquoi)
VB:
Private Sub CommandButton1_Click()
[Tableau1].ListObject.ListRows.Add.Range.Item(1).Resize(, 3) = Array(TextBox1, vbNullString, TextBox2): Unload Me
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TextBox1) = 0 Then
MsgBox "Veuillez remplir le " & TextBox1.Name & ", svp.", vbCritical, "Erreur!"
Cancel = -1: TextBox1.SetFocus
End If
End Sub

Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(TextBox2) = 0 Then
MsgBox "Veuillez remplir le " & TextBox2.Name & ", svp.", vbCritical, "Erreur!"
Cancel = -1: TextBox2.SetFocus
End If
End Sub
 

Si...

XLDnaute Barbatruc
re

Staple,il ne te reste qu'à jeter ton PC utilisé au message #35 :eek:!

Le pourquoi ne correspond plus à la discussion du départ.
Ouvre's en une autre pour que d'autres, plus qualifiés que moi, puissent t'éclairer* :cool:.

*tout Pierrot que je suis, ma chandelle est souvent vacillanteo_O
 

Staple1600

XLDnaute Barbatruc
Re

Depuis le post de troopers87, la question posée ne correspond plus à la question initiale posée par l'initiateur de ce fil.
Et je n'ai posé aucune question, j'ai simplement écrit que je ne savais pas pourquoi cela plantait hier.
 

troopers87

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

Bonjour Si, et pardon pour ma réponse tardive : je déménage et j'ai eu moins l'occasion de me poser tranquillement sur cette conversation. Merci pour ta proposition que je garde sous le coude ! Eh oui, les Tableaux c'est génial sous Excel et c'est pour cette raison que je voulais les utiliser. Ta contribution me permet de pas mal avancer sur le sujet.

Oui Staple, j'ai profité de ce post pour y poser ma question car il y a malgré tout un lien et je pense qu'au final, nous arrivons à un résultat complet. Je voulais aussi éviter de créer un énième sujet qui ne contenait qu'un bout de l'information.

Merci encore à tous et au plaisir d'échanger avec vous sur le forum :)
 

troopers87

XLDnaute Occasionnel
Bonjour à tous,

Je reviens vers vous car quelque chose me chiffonne concernant la proposition de code vers laquelle je m'oriente, c'est-à-dire celle de Si :

VB:
Private Sub CommandButton1_Click()
  Dim L As Long
  With [Tableau1]
    L = .Rows.Count + 1
    .Item(L, 1) = TextBox1
    .Item(L, 2) = CDbl(TextBox2)
  End With
  Unload Me
End Sub

Ce qui est génial, c'est effectivement l'utilisation du Tableau Excel qui évite de faire référence à la feuille qui contient ce tableau.
En revanche, je trouve dommage d'insérer ensuite un "1" plutôt que le nom de la colonne dans :
VB:
.Item(L, 1) = TextBox1
En effet, si j'insère une colonne, je devrais décaler chaque chiffre dans le code et on suit moins la philosophie initiale qui était le recours à un code ergonomique s'appuyant sur des références à des tableaux...

Donc, je tâtonne depuis tout à l'heure, mais je n'y arrive pas : en fait, je cherche quelque chose dans le genre de celui-ci :
Code:
.Item(L, [Tableau1[VILLES]]) = TextBox1
Mais forcément, ça ne fonctionne pas. Auriez-vous une idée ?

Merci pour votre aide :)
 

Discussions similaires

Réponses
3
Affichages
181

Statistiques des forums

Discussions
312 105
Messages
2 085 350
Membres
102 870
dernier inscrit
Armisa