Microsoft 365 Rechercher la dernière cellule saisie dans un TS et ajouter l'heure système

NONO14

XLDnaute Impliqué
Bonjour à toutes et à tous,
Me revoilà avec une nouvelle discussion. Voici mon problème.
Dans un formulaire UfPointage il y a un bouton qui doit servir à enregistrer l'heure système dans une feuille "Planning" dans un TS ("t_BDD").
Pour ce faire, on doit rechercher le code agent (Txt_Code) dans le TS, colonne "Code agent" qui est la 1ère colonne du TS, mais également rechercher si il y a déjà eu un pointage à la date du TextBox (TxB_DateJour). Si c'est le cas, alors on recherche le dernier pointage, le premier étant dans la colonne 6 (Pointage 1) et les autres à la suite jusqu'à la colonne 11 (Pointage 6).
De plus, lorsque l'on saisie le Code agent dans la Txt_Code, la ListBox (Lst_Pointage) doit se remplir des pointages déjà réalisés dans la semaine pour cet agent, si il y en a.
La ListBox doit contenir le N° semaine (Colonne 4 du TS, "Semaine") et la date de pointage. Les TextBox (Txt_Point 1 à 6) reçoivent les heures de pointages qui pourront être modifiées si besoin. Pour le moment, la ListBox et les Txt_Point sont Enabled=True. Ils seront rendu modifiable en cliquant sur le bouton modifier, mais ça on verra plus tard.
J'ai commencé un bout de code pour le remplissage du TS mais je ne sais pas comment faire pour la recherche du dernier pointage.
Merci par avance pour votre aide
VB:
Private Sub Cmb_Entrée_Click()
Dim Ctrl As Control
Dim TrouvLig As Boolean
Dim TrouvDerLig As Boolean

    If Me.Txt_Code.Value = "" Then 'Si la TextBox est vide, un message d'alerte dans le Label information
        Me.Lbx_Information.Caption = "Vous devez renseigner votre code"
        Exit Sub
    End If
   
    DeProtege ("Planning") 'On déprotège la feuille de calcul "Planning"
   
    With Sheets("Planning").ListObjects("t_BDD") 'On utilise la feuille et son TS pour les recherches et les saisies
   
    TrouvLig = False
       
        For i = 1 To ListRows.Count 'Pour chaque ligne du TS on recherche le code agent et la date
                If .ListColumns("Code agent").DataBodyRange(i) = Me.Txt_Code And .ListColumns("Dat").DataBodyRange(i) = Me.TxB_DateJour Then
            Ligne = i
    TrouvLig = True
       
        Exit For
                End If
        Next i
       
            If Not TrouvLig Then 'Si on a pas trouvé la ligne, on créé une nouvelle ligne
                Ligne = .ListRows.ass.Index
            End If
           
'On écrit les infos dans le TS
    .DataBodyRange(Ligne, 1) = Me.Txt_Code
    .DataBodyRange(Ligne, 2) = Me.Txt_Noms
    .DataBodyRange(Ligne, 3) = Me.Txt_Prénom

'Là je ne sait plus comment faire pour rechercher le dernier pointage à partir de la colonne 11 jusqu'à la 6
       
End Sub
 

Pièces jointes

  • GestPersonnnel (3).xlsm
    477.7 KB · Affichages: 12
Solution
bonjour

on est d'accord que pour répondre à la question posée dans le titre, il suffit de faire

VB:
with sheets("NomFeuille").listobjects("NomTS")
    .Listcolumns("NomColonne").databodyrange(.listrows.count)=now
end with

avec NomFeuille=nom de la feuille sur laquelle est le TS
NomTS = nom du TS
NomColonne = nom de la colonne du TS dans laquelle mettre la date du jour

NONO14

XLDnaute Impliqué
Re
il te suffit de modifier cette Ligne
VB:
   .Range(1, 5).Value = Format(Me.TxB_DateJour.Value, "dddd dd mmmm yyyy")
en
VB:
.Range(1, 5).Value =CDate(Me.TxB_DateJour.Tag)
Car si tu affiches la date au format "dddd dd mmmm yyyy" dans le TextBox , il te faut mettre la date Au Format "00000" ou "dd/mm/yyyy" par Exemple et dans la procédure tu récupéres la date au niveau de la propriété .Tag du TextBox "TxB_DateJour"

jean marie
C'est exactement ce que j'ai fait. J'ai mis du temps à trouver mais d'après ta proposition, je ne me suis pas trompé.
 

TooFatBoy

XLDnaute Barbatruc
J'essaie de trouver le code pour remplir la ListBox de l'UfPointage par les pointages de la semaine selon le code agent et le n° de semaine. Mais c'est la galère.
Je te propose ceci :
VB:
Private Sub Txt_Code_Change()
'
Dim Ligne As ListRow
Dim CodeRecherche As String
Dim NbLigTS As Long, NumLigTS As Long, NumLigListBox As Long
Dim i As Integer

    Me.Txt_Code.Text = UCase(Me.Txt_Code)

    ' On récupère le contenu de la Txt_Code
    CodeRecherche = Me.Txt_Code.Value

    ' On recherche le code dans la 1ère colonne du TS "t_Noms"
    For Each Ligne In Range("t_Noms").ListObject.ListRows

        ' Si le code agent est trouvé
        If Ligne.Range(1, 1).Value = CodeRecherche Then

            ' On récupère le contenu des 2e et 3e colonnes dans Txt_Noms
            Me.Txt_Noms.Value = Ligne.Range(1, 2).Value
            Me.Txt_Prénom.Value = Ligne.Range(1, 3).Value
            ' On vide la ListBox
            UfPointage.Lst_Pointage.Clear
            ' On dénombre les lignes du TS
            NbLigTS = Range("t_BDD").ListObject.ListRows.Count
            NumLigListBox = -1
            For NumLigTS = 1 To NbLigTS
                If Range("t_BDD[Code agent]")(NumLigTS).Value = CodeRecherche And Range("t_BDD[Semaine]")(NumLigTS).Value = WorksheetFunction.IsoWeekNum(Date) Then
                    NumLigListBox = NumLigListBox + 1
                    ' On ajoute une ligne à la ListBox
                    UfPointage.Lst_Pointage.AddItem
                    ' On écrit la date dans la première colonne de la ListBox
                    UfPointage.Lst_Pointage.Column(0, NumLigListBox) = Range("t_BDD[Date]")(NumLigTS).Text
                    ' On écrit les heures de pointage de la 2e à la 7e colonne de la ListBox
                    For i = 1 To 6
                        UfPointage.Lst_Pointage.Column(i, NumLigListBox) = Range("t_BDD")(NumLigTS, i + 5).Text
                    Next i
                End If
            Next NumLigTS
            Exit For

        ' Si le code agent n'est pas trouvé
        Else

            Me.Txt_Noms.Value = ""
            Me.Txt_Prénom.Value = ""
            UfPointage.Lst_Pointage.Clear

        End If

    Next Ligne

End Sub
 

Pièces jointes

  • GestPersonnnel (3) ( Nono14 - 2024-10-11_15-41 ) (TFB-002).xlsm
    489 KB · Affichages: 2

NONO14

XLDnaute Impliqué
Je te propose ceci :
VB:
Private Sub Txt_Code_Change()
'
Dim Ligne As ListRow
Dim CodeRecherche As String
Dim NbLigTS As Long, NumLigTS As Long, NumLigListBox As Long
Dim i As Integer

    Me.Txt_Code.Text = UCase(Me.Txt_Code)

    ' On récupère le contenu de la Txt_Code
    CodeRecherche = Me.Txt_Code.Value

    ' On recherche le code dans la 1ère colonne du TS "t_Noms"
    For Each Ligne In Range("t_Noms").ListObject.ListRows

        ' Si le code agent est trouvé
        If Ligne.Range(1, 1).Value = CodeRecherche Then

            ' On récupère le contenu des 2e et 3e colonnes dans Txt_Noms
            Me.Txt_Noms.Value = Ligne.Range(1, 2).Value
            Me.Txt_Prénom.Value = Ligne.Range(1, 3).Value
            ' On vide la ListBox
            UfPointage.Lst_Pointage.Clear
            ' On dénombre les lignes du TS
            NbLigTS = Range("t_BDD").ListObject.ListRows.Count
            NumLigListBox = -1
            For NumLigTS = 1 To NbLigTS
                If Range("t_BDD[Code agent]")(NumLigTS).Value = CodeRecherche And Range("t_BDD[Semaine]")(NumLigTS).Value = WorksheetFunction.IsoWeekNum(Date) Then
                    NumLigListBox = NumLigListBox + 1
                    ' On ajoute une ligne à la ListBox
                    UfPointage.Lst_Pointage.AddItem
                    ' On écrit la date dans la première colonne de la ListBox
                    UfPointage.Lst_Pointage.Column(0, NumLigListBox) = Range("t_BDD[Date]")(NumLigTS).Text
                    ' On écrit les heures de pointage de la 2e à la 7e colonne de la ListBox
                    For i = 1 To 6
                        UfPointage.Lst_Pointage.Column(i, NumLigListBox) = Range("t_BDD")(NumLigTS, i + 5).Text
                    Next i
                End If
            Next NumLigTS
            Exit For

        ' Si le code agent n'est pas trouvé
        Else

            Me.Txt_Noms.Value = ""
            Me.Txt_Prénom.Value = ""
            UfPointage.Lst_Pointage.Clear

        End If

    Next Ligne

End Sub
Bonjour 👋
Merci beaucoup pour ton code. Je le teste et je te redis.
 

NONO14

XLDnaute Impliqué
Pourquoi trois TS avec les données de pointage : t_Saisie, t_Recap, t_BDD ?

Un seul ne suffirait-il pas ?
Hello !
Alors pour répondre tout à fait à ta question. On garde les deux tableau t_Saisie et t_Recap.
t_Saisie a pour objet de garder toutes les pointages de la semaine
t_Recap ceux de toutes les semaines du mois, il a vocation a être adresser au comptable pour les payes.
t_Saisie doit être vidé de son contenu tous les jours dans le meilleur des cas ou en fin de semaine, il est donc remis à zéro pour ne pas avoir un trop grand tableau de saisies. Pour celui du mois, je dois créer une feuille pour conserver les données au moins 1 mois en cas de litige, après quoi, il est vidé.
J'espère que je suis assez clair dans mes explications, j'ai la tête dans le sable ce matin, c'est un peu difficile.
 

TooFatBoy

XLDnaute Barbatruc
On garde les deux tableau t_Saisie et t_Recap.
t_Saisie a pour objet de garder toutes les pointages de la semaine
t_Recap ceux de toutes les semaines du mois, il a vocation a être adresser au comptable pour les payes.
Ça n'a aucun intérêt.


t_Saisie doit être vidé de son contenu tous les jours dans le meilleur des cas ou en fin de semaine, il est donc remis à zéro pour ne pas avoir un trop grand tableau de saisies.
As-tu calculé, en gros, combien de lignes aurait ton TS au bout d'un an s'il n'était pas vidé ?


Pour celui du mois, je dois créer une feuille pour conserver les données au moins 1 mois en cas de litige, après quoi, il est vidé.
Donc tu veux dire que vous ne gardez aucune trace des pointages au-delà de deux mois ?!? 😯


Franchement, il faut vraiment que ton donneur d'ordre arrête de mettre son nez dans ce projet !
Quel est l'intérêt de vider le tableau tous les jours ???
Ça fait du code à créer en plus pour rien, donc temps de développement du projet allongé et complexité de la maintenance augmentée, etc. ☹️
 
Dernière édition:

NONO14

XLDnaute Impliqué
Ça n'a aucun intérêt.



As-tu calculé, en gros, combien de lignes aurait ton TS au bout d'un an s'il n'était pas vidé ?



Donc tu veux dire que vous ne gardez aucune trace des pointages au-delà de deux mois ?!? 😯


Franchement, il faut vraiment que ton donneur d'ordre arrête de mettre son nez dans ce projet !
Quel est l'intérêt de vider le tableau tous les jours ???
Ça fait du code à créer en plus pour rien, donc temps de développement du projet allongé et complexité de la maintenance augmentée, etc. ☹️
Comment dois-je procéder alors ? Garder qu'un seul tableau ? J'avoue ne plus savoir...
Si le TS n'est pas vidé et si l'on considère un maximum de 1 ligne par jour pour 19 employés pour 47 semaines de travail = 19*7*47 = 6251 lignes d'écritures dans le "t_Saisie". Si mes calculs sont bons.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
315 096
Messages
2 116 179
Membres
112 677
dernier inscrit
Justine11