Problème lors d'un ajout multiple de produits dans un tableau, supprime la dernière ligne (VBA + excel)

remy3434

XLDnaute Nouveau
Bonjour à tous,

Je viens vers vous aujourd'hui car je rencontre une difficulté sur le code,

j'ai un formulaire avec lequel je peux rentrer la commande de mon client et les différents produits associés (souvent des formules composées de plusieurs produits)

Mon problème est que quand je valide ce formulaire, mes données se rentrent automatiquement dans un tableau. Jusqu'ici tout fonctionne (merci Thierry)

Cependant lorsque j'ajoute une nouvelle commande, au lieu d'appliquer un Endxlup+1, le programme inscrit la première donnée de cette nouvelle commande sur la dernière ligne de la précédente au lieu de se mettre dans la cellule du dessous (en +1) J'ai essayé pas mal de combine mais je sèche.

Je vous mets en lien mon code + Screenshots pour mon explication

VB:
'========================= GESTION COMMANDE ============================
L = WsCmd.Range("F1000").End(xlUp).Row
H = L

With Me.List_Pieces
    For i = 0 To .ListCount - 1
       For j = 0 To 5
          WsCmd.Cells(L, j + 7) = Me.List_Pieces.List(i, j)
       Next j
    L = L + 1
    Next i
End With

For i = H To L - 1
    For Each CTRL In Me.Controls
        If IsNumeric(CTRL.Tag) = True Then
            If CTRL.Tag <> "2" Then
                WsCmd.Cells(i, CInt(CTRL.Tag)) = CTRL
            Else
                WsCmd.Cells(i, 2) = CDate(Me.txt_date) 'Sinon on a une date en Texte dans la feuille !
            End If
        End If
    Next CTRL
Next i

test1.png

test2.png

En espérant avoir été assez clair, je reste à votre disposition pour plus d'infos,

Merci!
Rémy
 
Dernière édition:

soan

XLDnaute Barbatruc
Je crois que ceci devrait aller :
VB:
Sub Essai()

  '========================= GESTION COMMANDE ============================
  L = WsCmd.Cells(Rows.Count, 6).End(xlUp).Row + 1: H = L
 
  With Me.List_Pieces
    For i = 0 To .ListCount - 1
      For j = 0 To 5
         WsCmd.Cells(L, j + 7) = Me.List_Pieces.List(i, j)
      Next j
      L = L + 1
    Next i
  End With
 
  For i = H To L - 1
    For Each CTRL In Me.Controls
      If IsNumeric(CTRL.Tag) = True Then
        If CTRL.Tag <> "2" Then
          WsCmd.Cells(i, CInt(CTRL.Tag)) = CTRL
        Else
          WsCmd.Cells(i, 2) = CDate(Me.txt_date) 'Sinon on a une date en Texte dans la feuille !
        End If
      End If
    Next CTRL
  Next i
 
End Sub
soan
 

remy3434

XLDnaute Nouveau
Merci pour ton retour,

J'ai bien tous mes articles qui s'affichent sans se bouffer entre eux on avance, cependant, maintenant, dès la première commande, on est hors tableau. voici le screen.

Désolé de pas fournir mon fichier mais j'ai des infos que je ne peux pas divulguer dessus. Habituellement je transforme en format forum mais la il est bien trop lourd et je risque de dérégler des choses.

test3.png
 

soan

XLDnaute Barbatruc
Merci pour tes infos ; finalement, comme tu utilises un tableau structuré, j'utilise une autre méthode,
qui n'a pas besoin du n° de la ligne d'en-têtes ; code VBA correspondant :
VB:
Sub Essai()

  '========================= GESTION COMMANDE ============================
  L = WsCmd.Cells(Rows.Count, 6).End(xlUp).Row
  Do While IsEmpty(WsCmd.Cells(L, 6)): L = L - 1: Loop
  L = L + 1: H = L

  With Me.List_Pieces
    For i = 0 To .ListCount - 1
      For j = 0 To 5
         WsCmd.Cells(L, j + 7) = Me.List_Pieces.List(i, j)
      Next j
      L = L + 1
    Next i
  End With

  For i = H To L - 1
    For Each CTRL In Me.Controls
      If IsNumeric(CTRL.Tag) = True Then
        If CTRL.Tag <> "2" Then
          WsCmd.Cells(i, CInt(CTRL.Tag)) = CTRL
        Else
          WsCmd.Cells(i, 2) = CDate(Me.txt_date) 'Sinon on a une date en Texte dans la feuille !
        End If
      End If
    Next CTRL
  Next i

End Sub
soan
 

soan

XLDnaute Barbatruc
Bonsoir remy3434,

Tu as écrit : « pourrais-tu m'expliquer ta méthode pour arriver à ce résultat ? »

Voici les explications :

L = WsCmd.Cells(Rows.Count, 6).End(xlUp).Row
L devrait être le n° ligne de la 1ère cellule non vide de la colonne F, mais comme il y a un Tableau structuré, L est le n° ligne de la dernière ligne du Tableau, colonne F, même si la cellule est vide.

Do While IsEmpty(WsCmd.Cells(L, 6)): L = L - 1: Loop
Boucle en colonne F : tant que la cellule est vide, L = L - 1, donc on teste la cellule au-dessus ; on sort donc de la boucle si ça trouve une cellule non vide : c'est soit le n° ligne de la dernière donnée du Tableau, soit, s'il n'y a aucune donnée, 4 : le n° ligne de l'en-tête en F4 : « Etat de la commande ».

L = L + 1
Une ligne sous le dernier L trouvé ; c'est donc le n° ligne de la cellule vide située sous la dernière donnée du Tableau, ou 5 : le n° de la cellule vide F5 située sous l'en-tête de colonne.

Le reste (H = L et la suite), tu l'avais déjà fais toi-même correctement. ;)

soan
 
Dernière édition:

Discussions similaires

Réponses
10
Affichages
516
Réponses
3
Affichages
334
Haut Bas