Microsoft 365 Erreur code ou pas ?

Marvin57

XLDnaute Occasionnel
Bonjour à tout le monde,

J'ai le code ci-dessous qui sert à transférer les données saisies via un UserForm.

Par contre, si le tableau de destination, qui est un tableau structuré, est vide, alors il me place la première inscription sur la première ligne hors du tableau !.

Est-ce que quelqu'un pourrait m'indiquer ce qui manque dans ce code S'il vous plaît.

Je vous remercie d'avance.

VB:
Private Sub VALIDATION_Click() 'Valider l'enregistrement
Dim Wtc As Worksheet
  Application.ScreenUpdating = False
  Set Wtc = Sheets("TYPES BCE")
  If VALIDATION.Caption = "VALIDER" Then
    Dl = Wtc.Range("A" & Rows.Count).End(xlUp).Row + 1
      If Dl = 2 Then
          Wtc.Cells(Dl, 1).Value = 1
      Else
        Wtc.Cells(Dl, 1).Value = Application.WorksheetFunction.Max(Wtc.Range("A2:A" & Dl).Value) + 1
      End If
      Wtc.Cells(Dl, 2).Value = CDate(Me.TextBox1.Value)
      Wtc.Cells(Dl, 2).NumberFormat = "m/d/yyyy"
      Wtc.Cells(Dl, 3).Value = CDate(Me.TextBox2.Value)
      Wtc.Cells(Dl, 3).NumberFormat = "m/d/yyyy"
      Wtc.Cells(Dl, 4).Value = CDate(Me.TextBox3.Value)
      Wtc.Cells(Dl, 4).NumberFormat = "m/d/yyyy"
      Wtc.Cells(Dl, 5).Value = Me.ComboBox1.Value
      Wtc.Cells(Dl, 6).Value = Me.ComboBox2.Value
      Wtc.Cells(Dl, 7).Value = Me.ComboBox3.Value
      Wtc.Cells(Dl, 8).Value = Me.TextBox4.Value
      If Me.OptionButton1 = True Then Wtc.Cells(Dl, 9).Value = Me.TextBox5.Value
      If Me.OptionButton2 = True Then Wtc.Cells(Dl, 10).Value = Me.TextBox5.Value
End if
End Sub

Marvin57
 
Solution
Je m'adressais au demandeur.
Voici la procédure complète que je propose :
VB:
Private Sub VALIDATION_Click() 'Valider l'enregistrement
   Dim LOt As ListObject, TVL()
   If Validation.Caption = "VALIDER" Then
      Set LOt = Sheets("CONGES").ListObjects(1)
      ReDim TVL(1 To 1, 1 To 10)
      If LOt.ListRows.Count > 0 Then
         TVL(1, 1) = Application.WorksheetFunction.Max(LOt.ListColumns(1).DataBodyRange) + 1
      Else
         TVL(1, 1) = 1
         End If
      TVL(1, 2).Value = CDate(Me.TextBox1.Value)
      TVL(1, 3).Value = CDate(Me.TextBox2.Value)
      TVL(1, 4).Value = CDate(Me.TextBox3.Value)
      TVL(1, 5).Value = Me.ComboBox1.Value
      TVL(1, 6).Value = Me.ComboBox2.Value
      TVL(1, 7).Value = Me.ComboBox3.Value...

Dranreb

XLDnaute Barbatruc
Bonjour.
Personnellement, je commence par verser les valeurs de contrôles dans un tableau dynamique que je nomme toujours TVL (Tableau de Valeurs de la Ligne). L'accès à un élément de tableau est considérablement plus rapide que l'accès à une cellule, ce dernier n'étant guère plus rapide que le déchargement en une seule instruction de tout ce tableau dans une plage horizontale de plusieurs cellules. Cette plage d'une nouvelle ligne peut être obtenue par la propriété Range de l'élément ListRow renvoyé par la méthode Add de la collection ListRows du ListObject représentant le tableau.
Par exemple :
VB:
Wtc.ListObjects(1).ListRows.Add.Range.Value = TVL
 

Marvin57

XLDnaute Occasionnel
Bonjour.
Personnellement, je commence par verser les valeurs de contrôles dans un tableau dynamique que je nomme toujours TVL (Tableau de Valeurs de la Ligne). L'accès à un élément de tableau est considérablement plus rapide que l'accès à une cellule, ce dernier n'étant guère plus rapide que le déchargement en une seule instruction de tout ce tableau dans une plage horizontale de plusieurs cellules. Cette plage d'une nouvelle ligne peut être obtenue par la propriété Range de l'élément ListRow renvoyé par la méthode Add de la collection ListRows du ListObject représentant le tableau.
Par exemple :
VB:
Wtc.ListObjects(1).ListRows.Add.Range.Value = TVL
Bonjour,

Merci pour ce retour.

Mais je place cette ligne ou S'il vous plaît ?
 

Dranreb

XLDnaute Barbatruc
Non, c'est impossible. La méthode Add de la collection ListRows d'un ListObject ajoute toujours une ligne incluse au tableau.
Joignez votre classeur si vous voulez que je voie pourquoi ça ne semble pas être le cas.
Déjà avez vous bien remplacé tous les Wtc.Cells(Dl, x) = par des TVL(1, x) = ?
 

Marvin57

XLDnaute Occasionnel
Non, c'est impossible. La méthode Add de la collection ListRows d'un ListObject ajoute toujours une ligne incluse au tableau.
Joignez votre classeur si vous voulez que je voie pourquoi ça ne semble pas être le cas.
Déjà avez vous bien remplacé tous les Wtc.Cells(Dl, x) = par des TVL(1, x) = ?
Re,

classeur cela va être compliqué à placé car données sensibles et volumineux. Désolé.

Voila le code modifié. Est-ce correct ?
VB:
Dim Wtc As Worksheet

  Application.ScreenUpdating = False
  Set Wtc = Sheets("CONGES")
  If VALIDATION.Caption = "VALIDER" Then
    TVLl = Wtc.Range("A" & Rows.Count).End(xlUp).Row + 1
      If TVLl = 2 Then
          Wtc.Cells(TVLl, 1).Value = 1
      Else
        Wtc.Cells(TVLl, 1).Value = Application.WorksheetFunction.Max(Wtc.Range("A2:A" & TVLl).Value) + 1
      End If
      Wtc.Cells(TVLl, 2).Value = CDate(Me.TextBox1.Value)
      Wtc.Cells(TVLl, 2).NumberFormat = "m/d/yyyy"
      Wtc.Cells(TVLl, 3).Value = CDate(Me.TextBox2.Value)
      Wtc.Cells(TVLl, 3).NumberFormat = "m/d/yyyy"
      Wtc.Cells(TVLl, 4).Value = CDate(Me.TextBox3.Value)
      Wtc.Cells(TVLl, 4).NumberFormat = "m/d/yyyy"
      Wtc.Cells(TVLl, 5).Value = Me.ComboBox1.Value
      Wtc.Cells(TVLl, 6).Value = Me.ComboBox2.Value
      Wtc.Cells(TVLl, 7).Value = Me.ComboBox3.Value
      Wtc.Cells(TVLl, 8).Value = Me.TextBox4.Value
      If Me.OptionButton1 = True Then Wtc.Cells(TVLl, 9).Value = Me.TextBox5.Value
      If Me.OptionButton2 = True Then Wtc.Cells(TVLl, 10).Value = Me.TextBox5.Value
      
        Wtc.ListObjects(1).ListRows.Add.Range.Value = TVL

Unload Me

End Sub
 

Dranreb

XLDnaute Barbatruc
Je m'adressais au demandeur.
Voici la procédure complète que je propose :
VB:
Private Sub VALIDATION_Click() 'Valider l'enregistrement
   Dim LOt As ListObject, TVL()
   If Validation.Caption = "VALIDER" Then
      Set LOt = Sheets("CONGES").ListObjects(1)
      ReDim TVL(1 To 1, 1 To 10)
      If LOt.ListRows.Count > 0 Then
         TVL(1, 1) = Application.WorksheetFunction.Max(LOt.ListColumns(1).DataBodyRange) + 1
      Else
         TVL(1, 1) = 1
         End If
      TVL(1, 2).Value = CDate(Me.TextBox1.Value)
      TVL(1, 3).Value = CDate(Me.TextBox2.Value)
      TVL(1, 4).Value = CDate(Me.TextBox3.Value)
      TVL(1, 5).Value = Me.ComboBox1.Value
      TVL(1, 6).Value = Me.ComboBox2.Value
      TVL(1, 7).Value = Me.ComboBox3.Value
      TVL(1, 8).Value = Me.TextBox4.Value
      If Me.OptionButton1.Value Then TVL(1, 9).Value = CCur(Me.TextBox5.Value)
      If Me.OptionButton2.Value Then TVL(1, 10).Value = CCur(Me.TextBox5.Value)
      LOt.ListRows.Add.Range.Value = TVL
      Unload Me
      End If
   End Sub
 

Marvin57

XLDnaute Occasionnel
Je m'adressais au demandeur.
Voici la procédure complète que je propose :
VB:
Private Sub VALIDATION_Click() 'Valider l'enregistrement
   Dim LOt As ListObject, TVL()
   If Validation.Caption = "VALIDER" Then
      Set LOt = Sheets("CONGES").ListObjects(1)
      ReDim TVL(1 To 1, 1 To 10)
      If LOt.ListRows.Count > 0 Then
         TVL(1, 1) = Application.WorksheetFunction.Max(LOt.ListColumns(1).DataBodyRange) + 1
      Else
         TVL(1, 1) = 1
         End If
      TVL(1, 2).Value = CDate(Me.TextBox1.Value)
      TVL(1, 3).Value = CDate(Me.TextBox2.Value)
      TVL(1, 4).Value = CDate(Me.TextBox3.Value)
      TVL(1, 5).Value = Me.ComboBox1.Value
      TVL(1, 6).Value = Me.ComboBox2.Value
      TVL(1, 7).Value = Me.ComboBox3.Value
      TVL(1, 8).Value = Me.TextBox4.Value
      If Me.OptionButton1.Value Then TVL(1, 9).Value = CCur(Me.TextBox5.Value)
      If Me.OptionButton2.Value Then TVL(1, 10).Value = CCur(Me.TextBox5.Value)
      LOt.ListRows.Add.Range.Value = TVL
      Unload Me
      End If
   End Sub
Re,

Ouf ! Merci Dranreb. Nickel !.

Désolé pour les 36 questions, mais quand on ne connait pas c'est compliqué.
Je n'y touche plus.

A bientôt peut-être.
Marvin57
 

dysorthographie

XLDnaute Accro
Bonjour,

Merci à vous également pour votre aide, mais je ne comprends rien de ce que vous m'indiquez, je ne sais même pas ou placer tout cela !
Désolé je pensais que le code placé au poste #1 était de toit.
Donc "mm/dd/yyyy" c'est le format américain mois/jours/année tu as inversé le jour et le moi pour un affichage pseudo français.
Code:
Wtc.Cells(TVLl, 2).Value = Format(Me.TextBox1.Value,"yyyy-mm-dd") ' ici on est au format international donc compréhensible par Excel français
     ' Wtc.Cells(TVLl, 2).NumberFormat = "m/d/yyyy"

Vue que j'ai modifié une partie du codé que tu as toi même fournir je pensais que tu t'y retrouverai.

Personnellement je ne caste pas les dates avec cdate qui prend en charge les paramètres régionaux.
 

Statistiques des forums

Discussions
314 841
Messages
2 113 481
Membres
111 877
dernier inscrit
thierry@1965