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.
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
Edit,
Je n'avais pas regardé ton code, mais comme tu utilises un Tableau Structuré, utilise les bons outils...(et surtout, les bons codes...)
Quelques conseils dans cette page (notamment en bas, les instructions VBA pour bien travailler avec un TS)
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
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
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
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
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.
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
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
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