Microsoft 365 Décalage de ligne lors de la saisie

Marvin57

XLDnaute Occasionnel
Bonjour à tout le monde,

j'ai un petit soucis lors de la saisie et validation de mes données vers un tableau structuré.

C'est à dire :

Lorsque je saisi les données dans mon userform et que je clique sur valider, il me m'inscrit les données à la suite de mon tableau structuré au lieu de le faire une ligne au dessus.

Voici le code qui sert à valider cela.

J'espère que cela va vous aider à comprendre mon problème car mon fichier est très volumineux et difficile a transmettre.

Le tableau structuré de l'onglet "POINTS" se nomme "Tableau28" si vous avez besoin de cette info.
Le tableau "Tableau28" démarre à la ligne A2 de l'onglet "POINTS".

Private Sub VALIDATION_Click() 'Valider l'enregistrement des points saisis
Dim Wtc As Worksheet
Application.ScreenUpdating = False
Set Wtc = Sheets("POINTS")
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

Actualiser_Affiche
MsgBox " Points enregistrés"
Else
Dl = Wtc.Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To Dl
If Me.lbltc.Caption = Wtc.Cells(i, 1).Value Then
Wtc.Range(Wtc.Cells(i, 2), Wtc.Cells(i, 10)) = ""
Wtc.Cells(i, 2).Value = CDate(Me.TextBox1.Value)
Wtc.Cells(i, 2).NumberFormat = "m/d/yyyy"
Wtc.Cells(i, 3).Value = CDate(Me.TextBox2.Value)
Wtc.Cells(i, 3).NumberFormat = "m/d/yyyy"
Wtc.Cells(i, 4).Value = CDate(Me.TextBox3.Value)
Wtc.Cells(i, 4).NumberFormat = "m/d/yyyy"
Wtc.Cells(i, 5).Value = Me.ComboBox1.Value
Wtc.Cells(i, 6).Value = Me.ComboBox2.Value
Wtc.Cells(i, 7).Value = Me.ComboBox3.Value
Wtc.Cells(i, 8).Value = Me.TextBox4.Value
If Me.OptionButton1 = True Then Wtc.Cells(i, 9).Value = Me.TextBox5.Value
If Me.OptionButton2 = True Then Wtc.Cells(i, 10).Value = Me.TextBox5.Value
Actualiser_Affiche
RAZ
Exit For
End If
Next
Me.LblTypeConge = "Points donnés "
Me.OptionButton1 = True
VALIDATION.Caption = "VALIDER"
VALIDATION.BackColor = &HFF00&
MsgBox " Points donnés modifiés"
End If


End Sub

Merci d'avance à vous pour vos infos et rectifications.

Marvin57
 

Marvin57

XLDnaute Occasionnel
Retrouvé avec plaisir un calendrier qui venait de moi ;)
Mais pourquoi y avoir ajouté un bouton QUITTER ? La croix de fermeture ou la touche Echap faisait déjà le taf, non ? Remarquez, j'en ai maintenant une version permettant de saisir aussi l'heure …
Bon je retourne à l'objet due la discussion. À plus …
(Remarque: vous auriez intérêt à renommer tous vos contrôles d'un nom mnémonique, ce serait bien plus facile de s'y retrouver que de chaque fois chercher …)
Super votre calendrier.
En ce qui concerne le bouton quitter, je l'ai rajouté car dans mon fichier je me sert autrement du calendrier.

A+
 

Marvin57

XLDnaute Occasionnel
hello Bernard

@Marvin57
et pour éviter le double message à l'enregistrement

VB:
Private Sub VALIDATION_Click() 'Valider l'enregistrement des congés saisis
    Dim Wtc As Worksheet
    Application.ScreenUpdating = False
   
    Set Wtc = Sheets("POINTS")
    With Wtc.ListObjects(1)
        If VALIDATION.Caption = "VALIDER" Then
            .ListRows.Add
            ligne = .ListRows.Count
            Message = "Points demandés enregistrés"
        Else
            Set trouve = .ListColumns(1).Range.Find(Me.lbltc.Caption, lookat:=xlWhole)
            If Not trouve Is Nothing Then
                ligne = trouve.Row - .Range.Row
            End If
            Message = "Points de l'élève modifiés"
        End If
       
        .DataBodyRange(ligne, 1) = WorksheetFunction.Max(.ListColumns(1).DataBodyRange) + 1
        .DataBodyRange(ligne, 2).Value = CDate(Me.TextBox1.Value)
        .DataBodyRange(ligne, 2).NumberFormat = "m/d/yyyy"
        .DataBodyRange(ligne, 3).Value = CDate(Me.TextBox2.Value)
        .DataBodyRange(ligne, 3).NumberFormat = "m/d/yyyy"
        .DataBodyRange(ligne, 4).Value = CDate(Me.TextBox3.Value)
        .DataBodyRange(ligne, 4).NumberFormat = "m/d/yyyy"
        .DataBodyRange(ligne, 5).Value = Me.ComboBox1.Value
        .DataBodyRange(ligne, 6).Value = Me.ComboBox2.Value
        .DataBodyRange(ligne, 7).Value = Me.ComboBox3.Value
        .DataBodyRange(ligne, 8).Value = Me.TextBox4.Value
        If Me.OptionButton1 = True Then .DataBodyRange(ligne, 9).Value = Me.TextBox5.Value
        If Me.OptionButton2 = True Then .DataBodyRange(ligne, 10).Value = Me.TextBox5.Value
    End With
    MsgBox Message
    Me.LblTypePoints = "Points payés "
    Me.OptionButton1 = True
    VALIDATION.Caption = "VALIDER"
    VALIDATION.BackColor = &HFF00&

    Sheets("POINTS").Activate
    Application.ScreenUpdating = True
    Unload Me
   
End Sub

une remarque.. on est bien d'accord que dans le code fourni, à aucun moment, le bouton "Valider" change de texte en "Modifier"...?
Bonjour vgendron,

Merci pour ton travail sur le code dans ma demande.

Alors, il m'inscrit bien tout dans le tableau maintenant.

Et oui, moi j'ai oublié de mentionner que le bouton valider peut changer en modifier !!! Vraiment désolé pour cet oubli !!!🙈

Est-il possible de modifier cela SVP ?

Merci à vous
 

vgendron

XLDnaute Barbatruc
modifier quoi??
à quel moment ton bouton passe en "modifier"??

je faisais juste remarquer que dans ton fichier, le bouton est TOUJOURS en "valider"..
donc le test if bouton.caption="Valider" else.... ne sert pas à grand chose en l'état..
 

vgendron

XLDnaute Barbatruc
après.. valider ou modifier. le texte du bouton.. on s'en fout un peu..
quand tu fais le test, si trouve is nothing.. ca veut dire que c'est une nouvelle ligne
si NOT trouve is nothing, ca veut dire que tu modifies une ligne existante...
 

Marvin57

XLDnaute Occasionnel
Bon, l'ai pas encore testé, mais écrit selon ce que je voyais …
Bonjour Dranreb,

Merci pour le retour mais cela ne fonctionne pas !!
après.. valider ou modifier. le texte du bouton.. on s'en fout un peu..
quand tu fais le test, si trouve is nothing.. ca veut dire que c'est une nouvelle ligne
si NOT trouve is nothing, ca veut dire que tu modifies une ligne existante...
Re,
OK, alors vous me conseillez quoi ? de mettre un autre bouton pour modifier si besoin ?
 

vgendron

XLDnaute Barbatruc
pas besoin d 'un autre bouton

celui qui existe, tu mets "Enregistrer"
et le code

VB:
Private Sub VALIDATION_Click() 'Valider l'enregistrement des congés saisis
    Dim Wtc As Worksheet
    Application.ScreenUpdating = False
    
    Set Wtc = Sheets("POINTS")
    With Wtc.ListObjects(1)
        Set trouve = .ListColumns(1).Range.Find(Me.lbltc.Caption, lookat:=xlWhole)
        If Not trouve Is Nothing Then
            ligne = trouve.Row - .Range.Row
            Message = "Points de l'élève modifiés"
        Else
            .ListRows.Add
            ligne = .ListRows.Count
            Message = "Points demandés enregistrés"
        End If

        .DataBodyRange(ligne, 1) = WorksheetFunction.Max(.ListColumns(1).DataBodyRange) + 1
        .DataBodyRange(ligne, 2).Value = CDate(Me.TextBox1.Value)
        .DataBodyRange(ligne, 2).NumberFormat = "m/d/yyyy"
        .DataBodyRange(ligne, 3).Value = CDate(Me.TextBox2.Value)
        .DataBodyRange(ligne, 3).NumberFormat = "m/d/yyyy"
        .DataBodyRange(ligne, 4).Value = CDate(Me.TextBox3.Value)
        .DataBodyRange(ligne, 4).NumberFormat = "m/d/yyyy"
        .DataBodyRange(ligne, 5).Value = Me.ComboBox1.Value
        .DataBodyRange(ligne, 6).Value = Me.ComboBox2.Value
        .DataBodyRange(ligne, 7).Value = Me.ComboBox3.Value
        .DataBodyRange(ligne, 8).Value = Me.TextBox4.Value
        If Me.OptionButton1 = True Then .DataBodyRange(ligne, 9).Value = Me.TextBox5.Value
        If Me.OptionButton2 = True Then .DataBodyRange(ligne, 10).Value = Me.TextBox5.Value
    End With
    MsgBox Message
    Me.LblTypePoints = "Points payés "
    Me.OptionButton1 = True
    VALIDATION.Caption = "VALIDER"
    VALIDATION.BackColor = &HFF00&

    Sheets("POINTS").Activate
    Application.ScreenUpdating = True
    Unload Me
    
End Sub
 

Marvin57

XLDnaute Occasionnel
pas besoin d 'un autre bouton

celui qui existe, tu mets "Enregistrer"
et le code

VB:
Private Sub VALIDATION_Click() 'Valider l'enregistrement des congés saisis
    Dim Wtc As Worksheet
    Application.ScreenUpdating = False
   
    Set Wtc = Sheets("POINTS")
    With Wtc.ListObjects(1)
        Set trouve = .ListColumns(1).Range.Find(Me.lbltc.Caption, lookat:=xlWhole)
        If Not trouve Is Nothing Then
            ligne = trouve.Row - .Range.Row
            Message = "Points de l'élève modifiés"
        Else
            .ListRows.Add
            ligne = .ListRows.Count
            Message = "Points demandés enregistrés"
        End If

        .DataBodyRange(ligne, 1) = WorksheetFunction.Max(.ListColumns(1).DataBodyRange) + 1
        .DataBodyRange(ligne, 2).Value = CDate(Me.TextBox1.Value)
        .DataBodyRange(ligne, 2).NumberFormat = "m/d/yyyy"
        .DataBodyRange(ligne, 3).Value = CDate(Me.TextBox2.Value)
        .DataBodyRange(ligne, 3).NumberFormat = "m/d/yyyy"
        .DataBodyRange(ligne, 4).Value = CDate(Me.TextBox3.Value)
        .DataBodyRange(ligne, 4).NumberFormat = "m/d/yyyy"
        .DataBodyRange(ligne, 5).Value = Me.ComboBox1.Value
        .DataBodyRange(ligne, 6).Value = Me.ComboBox2.Value
        .DataBodyRange(ligne, 7).Value = Me.ComboBox3.Value
        .DataBodyRange(ligne, 8).Value = Me.TextBox4.Value
        If Me.OptionButton1 = True Then .DataBodyRange(ligne, 9).Value = Me.TextBox5.Value
        If Me.OptionButton2 = True Then .DataBodyRange(ligne, 10).Value = Me.TextBox5.Value
    End With
    MsgBox Message
    Me.LblTypePoints = "Points payés "
    Me.OptionButton1 = True
    VALIDATION.Caption = "VALIDER"
    VALIDATION.BackColor = &HFF00&

    Sheets("POINTS").Activate
    Application.ScreenUpdating = True
    Unload Me
   
End Sub
Re,
Merci à vous vgendron.
Cela fonctionne comme voulu.

Oui, quand je sélectionne des données de la listbox, elles sont chargées. Mais cela fonctionne.
Je vais faire une série de test et je reviendrai ce soir.
 

Discussions similaires

Réponses
17
Affichages
752
Réponses
5
Affichages
589
Réponses
4
Affichages
403

Statistiques des forums

Discussions
314 841
Messages
2 113 476
Membres
111 876
dernier inscrit
marccan