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...

Marvin57

XLDnaute Occasionnel
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.
Re,

pas de soucis. J'ai bien noté ton indication. ça me servira un jour.👍👍
 

Dranreb

XLDnaute Barbatruc
Attention, je viens de m'apercevoir que dans le code que j'ai proposé au #11 j'avais laissé des .Value qui n'ont rien à faire derrière des éléments de tableau. Le bon code devrait plutôt être celui ci :
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) = CDate(Me.TextBox1.Value)
      TVL(1, 3) = CDate(Me.TextBox2.Value)
      TVL(1, 4) = CDate(Me.TextBox3.Value)
      TVL(1, 5) = Me.ComboBox1.Value
      TVL(1, 6) = Me.ComboBox2.Value
      TVL(1, 7) = Me.ComboBox3.Value
      TVL(1, 8) = Me.TextBox4.Value
      If Me.OptionButton1.Value Then TVL(1, 9) = CCur(Me.TextBox5.Value)
      If Me.OptionButton2.Value Then TVL(1, 10) = CCur(Me.TextBox5.Value)
      LOt.ListRows.Add.Range.Value = TVL
      Unload Me
      End If
   End Sub
 

Marvin57

XLDnaute Occasionnel
Attention, je viens de m'apercevoir que dans le code que j'ai proposé au #11 j'avais laissé des .Value qui n'ont rien à faire derrière des éléments de tableau. Le bon code devrait plutôt être celui ci :
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) = CDate(Me.TextBox1.Value)
      TVL(1, 3) = CDate(Me.TextBox2.Value)
      TVL(1, 4) = CDate(Me.TextBox3.Value)
      TVL(1, 5) = Me.ComboBox1.Value
      TVL(1, 6) = Me.ComboBox2.Value
      TVL(1, 7) = Me.ComboBox3.Value
      TVL(1, 8) = Me.TextBox4.Value
      If Me.OptionButton1.Value Then TVL(1, 9) = CCur(Me.TextBox5.Value)
      If Me.OptionButton2.Value Then TVL(1, 10) = CCur(Me.TextBox5.Value)
      LOt.ListRows.Add.Range.Value = TVL
      Unload Me
      End If
   End Sub
Bonjour,

Merci pour la nouvelle version. Je n'avais rien remarqué !

A+
Marvin57
 

Statistiques des forums

Discussions
314 698
Messages
2 112 016
Membres
111 392
dernier inscrit
riffaud