XL 2016 première ligne d'un tableau

halecs93

XLDnaute Impliqué
Bonjour,

Je suis en train de créer un fichier de commande de matériel. Pour cela, je rentre les infos via un userform.

Lorsque je valide la commande, le tableau dans la feuil1 d'excel s'incrémente. Mais je ne comprends pas pourquoi la première ligne (ligne 16) reste vide. C'est la ligne 17 puis les suivantes qui se remplissent.

Si quelqu'un a une idée.... merci.

1674650502094.png
 

Pièces jointes

  • COMMANDE TEST v3.xls
    65.5 KB · Affichages: 6

Cousinhub

XLDnaute Barbatruc
Inactif
Bonjour,
Comme c'est un Tableau Structuré, il va garder les formules s'il y en a même si tu supprimes "tout"...
Tu fais un clic droit dans une des cellules de la ligne 16 du TS (cellule F16, par exemple)
- Supprimer - > Lignes de Tableau
(si tu essaies une deuxième fois, cette option sera grisée)
Puis, refais ta manip d'insertion
 

Gégé-45550

XLDnaute Accro
Bonjour,
une petite modif dans le code du CommandButton1_Click du UserForm2
VB:
If Range("Tableau1").ListObject.DataBodyRange Is Nothing Then
   lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
Else
   lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row + 1
End If
Cordialement,
 

chris

XLDnaute Barbatruc
Bonjour

Quand on utilise un tableau structuré on n'utilise pas End(xlUp)

On prend l'habitude de donner des noms signifiants et pas noms automatiques

Je m'étonne qu'avec Feuil1 et Tableau1, TextBox1... tu n'aies pas aussi gardé Classeur1...

Pourquoi un format xls périmé depuis plus de 15 ans ?

Ceci suffit sous réserve de dé fusionner tes cellules DEF en haut, d'avoir un tableau réellement vide.
Cela évite aussi de balancer du texte dans des cellules numériques

VB:
Private Sub CommandButton1_Click()
    'Ajout des informations dans la feuille de calcul
    Dim Nouv As Range
    j = [Tableau1].ListObject.ListRows.Add.Index

    [tableau1[Ref.]].Rows(j) = Me.TextBox1.Text
    [tableau1[Article]].Rows(j) = Me.TextBox2.Text
    [tableau1[Quantité]].Rows(j) = CLng(Me.TextBox3.Text)
    [tableau1[P.U]].Rows(j) = CCur(Me.TextBox4.Text)
    [tableau1[P.T]].Rows(j) = CCur(Me.TextBox4.Text) * CCur(Me.TextBox3.Text)
 
    'Calcul de la somme totale
    With Worksheets("Feuil1")
        .Range("F1") = "Total :"
        .Range("F2").Formula = "=SUM(Tableau1[P.T])"
        .Range("F2").NumberFormat = "0.00"
    End With
 
    'Nettoyage des champs
    Me.TextBox1.Text = ""
    Me.TextBox2.Text = ""
    Me.TextBox3.Text = "0"
    Me.TextBox4.Text = "0"
    Me.TextBox5.Text = "0"
End Sub

EDIT : oups pas vu qu'il y avait du monde sur le fil. Bonjour à tous
A noter que je préfère nommer les colonnes dans le code qu'utiliser leur position ce qui permet de les réagencer sans toucher au code
 

Pièces jointes

  • COMMANDE TEST v4.xlsm
    33.2 KB · Affichages: 1
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Rappel: la méthode Add de la collection ListRows renvoie un objet ListRow, et celui ci est muni d'une propriété Range représentant alors la plage couverte par la ligne ajoutée.
Le plus simple et rapide est donc de passer par un Tableau dynamique des Valeurs de la Ligne (je l'appelle généralement TVL) d'affecter à ses éléments, convenablement convertis en les types de données de cellules appropriés, les String Value des contrôles, et de n'ajouter la ligne que tout à la fin par LOt.ListRows.Add.Range.Value = TVL
 

halecs93

XLDnaute Impliqué
Bonjour.
Rappel: la méthode Add de la collection ListRows renvoie un objet ListRow, et celui ci est muni d'une propriété Range représentant alors la plage couverte par la ligne ajoutée.
Le plus simple et rapide est donc de passer par un Tableau dynamique des Valeurs de la Ligne (je l'appelle généralement TVL) d'affecter à ses éléments, convenablement convertis en les types de données de cellules appropriés, les String Value des contrôles, et de n'ajouter la ligne que tout à la fin par LOt.ListRows.Add.Range.Value = TVL
Très complexe tout ceci pour un novice tel que moi ;)
 

Dranreb

XLDnaute Barbatruc
Il faudrait commencer par ça, avant d'attaquer les choses.
il est plus souple à terme d'utiliser les noms des colonnes
C'est pour ça que j'ai créé des objets ComboBoxLiées et ControlsAssociés qui se chargent de ventiler dans un tableau les contrôles dont on leur confie la charge en spécifiant ces intitulés.

remplir le tableau pour le transférer ou directement remplir les colonnes fait le même lignes de code...
Avec les objets dont j'ai parlé plus haut c'est une seule ligne, méthode ValeursVers TVL ou ValeursDepuis TVL
 

patricktoulon

XLDnaute Barbatruc
re
Bonsoir
quand on crée un tableau structuré (vide) seulement avec les entêtes on le crée avec seulement la ligne d'entêtes la first ligne est toujours apparent mais le listrows.add le gère et place les donnée dans cette ligne
tout du moins sur 2013
on ne crée pas un TS avec une ligne vide


demo.gif
conclusion pour ton usf commande
l'ajout peut se faire comme suit meme si tu vois la ligne vide au depart c'est elle qui va etre prise encompte dans le listrows.add

j'ai bloqué les lignes total car tu fait appel a des cellules fusionnées

VB:
Private Sub CommandButton1_Click()
    'Récupération des informations saisies
  
    prixTotal = Val(TextBox3) * Val(TextBox4)
    Me.TextBox5.Text = prixTotal
  
  
   With Range("tableau8").ListObject.ListRows.Add.Range
   .Value = Array(TextBox1, TextBox2, TextBox3, TextBox4, prixTotal)
     End With
    
    'Calcul de la somme totale
    'ws.Range("F1").Value = "Total :"
    'ws.Range("F2").Formula = "=SUM(E2:E" & lastRow & ")"
    'ws.Range("F2").NumberFormat = "0.00"
   
 'Nettoyage des champs
    For i = 1 To 5:    Me.Controls("TextBox" & i) = "":    Next
    
    
End Sub
demonstration:
demo.gif
 

halecs93

XLDnaute Impliqué
re
Bonsoir
quand on crée un tableau structuré (vide) seulement avec les entêtes on le crée avec seulement la ligne d'entêtes la first ligne est toujours apparent mais le listrows.add le gère et place les donnée dans cette ligne
tout du moins sur 2013
on ne crée pas un TS avec une ligne vide


Regarde la pièce jointe 1161452conclusion pour ton usf commande
l'ajout peut se faire comme suit meme si tu vois la ligne vide au depart c'est elle qui va etre prise encompte dans le listrows.add

j'ai bloqué les lignes total car tu fait appel a des cellules fusionnées

VB:
Private Sub CommandButton1_Click()
    'Récupération des informations saisies
 
    prixTotal = Val(TextBox3) * Val(TextBox4)
    Me.TextBox5.Text = prixTotal
 
 
   With Range("tableau8").ListObject.ListRows.Add.Range
   .Value = Array(TextBox1, TextBox2, TextBox3, TextBox4, prixTotal)
     End With
   
    'Calcul de la somme totale
    'ws.Range("F1").Value = "Total :"
    'ws.Range("F2").Formula = "=SUM(E2:E" & lastRow & ")"
    'ws.Range("F2").NumberFormat = "0.00"
  
 'Nettoyage des champs
    For i = 1 To 5:    Me.Controls("TextBox" & i) = "":    Next
   
   
End Sub
demonstration:
Regarde la pièce jointe 1161453
Merci... je compile un peu tous les conseils
 

Discussions similaires

Statistiques des forums

Discussions
314 496
Messages
2 110 236
Membres
110 708
dernier inscrit
novy16