XL 2010 Pblme VBA ajout de ligne dans tableau

Emirogo

XLDnaute Nouveau
Bonsoir tout le monde, :)

Voilà j'ai un soucis avec un code VBA qui par ailleurs fonctionne bien dans un autre Userform o_Oo_Oo_O.

Mon soucis est le suivant, j'ai un code erreur qui proviendrait du code qui indique à excel d'ajouter une ligne au tableau si la cellule du haut n'est pas vide.

J'ai beau faire et refaire le code, j'ai toujours une erreur 9.

Je vous joins le fichier.

Merci par avance de votre aide car si ça continue je n'aurais bientôt plus de cheveux à m'arracher :eek::eek::eek:.
 

Pièces jointes

  • Mescomptes2020_essai_1.xlsm
    38.4 KB · Affichages: 10

Dranreb

XLDnaute Barbatruc
Bonsoir.
Vous n'avez certainement pas 21 membres dans la collection ListObjects de la feuille !
De fait un MsgBox Sheets("Compte").ListObjects.Count affiche 1, alors prenez .ListObjects(1) ou .ListObjects("Tableau21") si vous voulez l'isoler par son nom plutôt que par sa position dans la collection.
Profitez en d'ailleurs pour récupérer au moins le numéro de la ligne ajoutée en faisant
dlt = Sheets("Compte").ListObjects(1).ListRows.Add.Range.Row
Mais ce n'est encore pas comme ça que je fais en général …

Moi je fais plutôt :
VB:
Dim TVL(1 To 1, 1 To 7)
TVL(1, 1) = TextBox1.Value
TVL(1, 2) = TextBox2.Value
TVL(1, 3) = ComboBox1.Value
TVL(1, 4) = CDbl(TextBox3.Value)
TVL(1, 5) = CDbl(TextBox4.Value)
TVL(1, 6) = ComboBox2.Value
TVL(1, 7) = TextBox5.Value
Sheets("Compte").ListObjects(1).ListRows.Add.Range.Resize(, 7).Value = TVL
Enfin pas tout à fait: Je renomme d'abord de façon mnémonique les contrôles pour ne pas avoir à rechercher lesquels ce sont pour chaque colonne
 
Dernière édition:

Monptipiton

XLDnaute Nouveau
Bonsoir Emirogo, le forum,

Une solution simple :
VB:
Private Sub CommandButton1_Click()

With Sheets("Compte")
  If .Range("C13") = "" Then
    .Range("C13") = TextBox1
    Else
    .Range("C" & .Range("C1048576").End(xlUp).Row + 1) = TextBox1
    End If
    
    dlt = .Range("C1048576").End(xlUp).Row
    
    .Range("C" & dlt) = TextBox1.Value
    .Range("d" & dlt) = TextBox2.Value
    .Range("e" & dlt) = ComboBox1.Value
    If TextBox3.Value <> "" Then .Range("f" & dlt) = CDbl(TextBox3.Value)
    If TextBox4.Value <> "" Then .Range("g" & dlt) = CDbl(TextBox4.Value)
    .Range("h" & dlt) = ComboBox2.Value
    .Range("i" & dlt) = TextBox5.Value
End With


Unload Me
UserForm1.Show
End Sub

Le fait de rentrer une valeur en ligne +1 ajoute automatiquement une ligne au Tableau21

Ça marche ?
 

Emirogo

XLDnaute Nouveau
Bonjour Dranreb et Monptitpiton,

Monptitpiton ta solution ajoute bien une ligne et les éléments du formulaire :). Mais en fait il rajoute une ligne en dessous du tableau et moi je voudrais que la ligne rajouter soit dans le tableau afin de pouvoir exploiter celui-ci au fur et à mesure des opérations incrémentés.

Dranreb, j'ai essayé de rajouter
.dlt = Sheets("Compte").ListObjects("tableau21").ListRows.Add.Range.Row ) mais ce ne fonctionne pas :(

Pour votre autre code, je suis vraiment très débutante et je n'arrive pas à le comprendre :(.
 

Pièces jointes

  • Mescomptes2020_essai_1.xlsm
    40.6 KB · Affichages: 3
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Comme pour la plupart des collections Excel, la méthode Add de la collection ListRows renvoie un objet ListRow. Celui ci a une propriété Range qui représente la plage d'une ligne qu'il couvre. Alors c'est idiot de rechercher après coup cet objet Range avec un End(xlUp).Row. Tâchez de l'obtenir directement au moment de sa création.
Et moi je vais plus loin, je ne travaille jamais directement avec des séries de cellule isolées, c'est trop long. Le préfère préalablement tout mettre dans un tableau VBA d'une seule ligne que j'affecte ensuite d'un seul coup à la Value de ce Range au moment de la création du ListRow.
Vous pouvez décomposer si vous préférez :
VB:
Private Sub CommandButton1_Click()
Dim LRw As ListRow, Rng As Range, DLt As Long
Set LRw = Sheets("Compte").ListObjects(1).ListRows.Add
Set Rng = LRw.Range
DLt = Rng.Row
Mais vous n'avez plus vraiment besoin de connaitre DLt si vous avez Rng, vous pouvez faire Rng.Cells(1, 1).Value = TextBox1.Value etc.
Du moins toujours si vous tenez à affecter des valeurs aux cellules isolées, au coup par coup … C'est long d'accéder à une cellule. Aussi long pour une seule cellule que pour 100000 d'un seul coup, pratiquement.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 194
Messages
2 086 069
Membres
103 110
dernier inscrit
Privé