XL 2016 Ajouter une ligne en bas d'un tableau Excel [RESOLU]

troopers87

XLDnaute Occasionnel
Bonjour à tous,

Ce sujet fait suite au sujet ouvert ici : https://www.excel-downloads.com/thr...-donnees-de-la-derniere-ligne.20017421/page-2 et qui avait quelque peu dévié.

Voici ma demande qui repose sur le fichier proposé par Si au sein de cette même discussion : comme nous utilisons l'outil Tableau Excel pour éviter de faire des références "manuelles" à une feuille, je souhaiterais ajouter des données sous une colonne du tableau en utilisant le nom de la colonne et non son numéro. Cela me permettrait, si la colonne change de numéro (par exemple si une nouvelle colonne est insérée entre deux), de ne pas avoir à modifier le code en conséquence.

Voici donc le code initial :

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

et je souhaiterais remplacer le "1" de :

VB:
.Item(L, 1) = TextBox1

Par quelque chose qui ressemble à cela :

VB:
.Item(L, [Tableau1[VILLES]]) = TextBox1

Merci d'avance pour votre aide ! :)
 

Pièces jointes

  • Exemple 2.xlsm
    25.3 KB · Affichages: 41

Dranreb

XLDnaute Barbatruc
Bonjour.
Cela y ressemble-t-il assez à votre goût ? :
VB:
Private Sub CommandButton1_Click()
  Dim L As Long
  L = [Tableau1].ListObject.ListRows.Add.Index
  [Tableau1[PAYS]].Rows(L).Value = TextBox1.Text
  [Tableau1[DISTANCE]].Rows(L).Value = CDbl(TextBox2.Text)
  [Tableau1[CAPITALE]].Rows(L).Value = TextBox3.Text
  Unload Me
End Sub

Autre manière de faire qui minimise le nombre d'accès aux cellules (1 seul au lieu de 3) :
VB:
Private Sub CommandButton1_Click()
  Dim LOt As ListObject, TVL()
  Set LOt = [Tableau1].ListObject
  ReDim TVL(1 To 1, 1 To LOt.ListColumns.Count)
  TVL(1, LOt.ListColumns("PAYS").Index) = TextBox1.Text
  TVL(1, LOt.ListColumns("DISTANCE").Index) = CDbl(TextBox2.Text)
  TVL(1, LOt.ListColumns("CAPITALE").Index) = TextBox3.Text
  LOt.ListRows.Add.Range.Value = TVL
  Unload Me
End Sub
 
Dernière édition:

troopers87

XLDnaute Occasionnel
Bonjour Dranreb et merci beaucoup pour votre retour !

Votre première proposition me convient parfaitement : c'est génial !
Concernant la seconde, je ne comprends pas ce que vous entendez par "minimiser le nombre d'accès aux cellules" ?

Merci encore !
 

Dranreb

XLDnaute Barbatruc
J'entends par la qu'il n'y a qu'un seul accès à la propriété Value d'un Range au lieu de 3, et que c'est donc 3 fois plus rapide.
(On peut en effet considérer en pratique que 10000 écritures de valeur d'une cellule prennent 10000 fois plus de temps qu'une seule écriture d'un tableau comme valeur d'une plage de 10000 cellules. C'est le nombre d'accès qui est pénalisant, pas le nombre de cellules de chaque accès)
 

troopers87

XLDnaute Occasionnel
D'accord ! J'ai compris, effectivement ça peut être moins consommateur de ressources sur des tableaux de grande envergure.

En revanche, j'ai un souci avec votre première proposition : si la ligne précédente n'est pas complète (par exemple, une donnée n'a pas été saisie : ce qui est tout à fait probable en pratique, je reçois des messages d'erreur. Auriez-vous une solution de contournement ? Est-il possible de s'appuyer sur la proposition initiale et de faire un "mix" des deux méthodes ?

Merci d'avance :)
 

Dranreb

XLDnaute Barbatruc
C'est aussi moins saccadé si on écrit tout en une seule fois. Le rafraichissement de l'écran à chaque mise à jour n'est d’ailleurs peut être pas étranger à celle lenteur incompressible des propriétés Value des Range utilisées en écriture. Mais c'est long aussi en lecture.
Vous pouvez toujours, dans les 2 méthodes, faire If IsNumeric(TextBox2.Text) Then [Tableau1[DISTANCE]].Rows(L).Value
ou bien TVL(1, LOt.ListColumns("DISTANCE").Index)
= CDbl(TextBox2.Text)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 646
Messages
2 111 528
Membres
111 190
dernier inscrit
clmtj