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: 8

NONO14

XLDnaute Impliqué
Les six colonnes représentent les trois tranches tarifaires de la journée, ou les trois tranches horaires possibles au maximum pour un employé ?



Après avoir trouvé le code agent dans le TS de pointage, est-ce que tu ne dois pas vérifier que la ligne trouvée correspond bien à la date d'aujourd'hui ?
Oui tout à fait. J'ai commencé par une condition, le reste devrait être facile.
 

NONO14

XLDnaute Impliqué
Voici le code avec la recherche de la date en plus et la modification de l'ajout d'une ligne si le code agent n'est pas trouvé. Je pense que ce code est perfectible, mais j'ai fait ce que j'ai pu.
N'hésitez pas à me corriger, je suis là pour apprendre.

VB:
Private Sub Cmb_Entrée_Click()
Dim Wsh As Worksheet
Dim TblS As ListObject
Dim Cell As Range
Dim Found As Boolean
Dim NewRow As ListRow

'Définition de la feuille de calcul et du TS (Tableau Structuré)
    Set Wsh = Sheets("Tab_Pointage") 'Nom de la feuille
    Set TblS = Wsh.ListObjects("t_Saisie") 'Nom du TS
    
    Found = False

'On parcourt la 1ère colonne du TS pour rechercher la valeur de la Txt_Code
'Puis on recherche la date du jour dans la 5ème colonne
   For Each Cell In TblS.ListColumns(1).DataBodyRange
            If Cell.Value = Me.Txt_Code.Value And Cell.Offset(0, 4).Value = Me.TxB_DateJour Then
        
        Found = True
        
'On recherche la première cellule vide à partir de la 6ème colonne
            For i = 6 To TblS.ListColumns.Count
                If IsEmpty(Cell.Offset(0, i - 1)) Then
                    Cell.Offset(0, i - 1).Value = Format(Now, "hh:mm")
                    Exit For
                End If
            Next i
    Exit For
        End If
    Next Cell
    
'Si la valeur de Txt_Code n'est pas trouvée, on créé une nouvelle ligne
    If Not Found Then
        Set NewRow = TblS.ListRows.Add
        With NewRow
            .Range(1, 1).Value = Me.Txt_Code.Value
            .Range(1, 2).Value = Me.Txt_Noms.Value
            .Range(1, 3).Value = Me.Txt_Prénom.Value
            .Range(1, 4).Value = Me.Txt_NumSem.Value
            .Range(1, 5).Value = Format(Me.TxB_DateJour.Value, "dddd dd mmmm yyyy")
            .Range(1, 6).Value = Format(Now, "hh:mm")
        End With
    End If
End Sub
 

TooFatBoy

XLDnaute Barbatruc
Waouh ! C'est beau ! 👍

En revanche, je pense qu'il y a une petite erreur (répétée trois fois) :
Enrichi (BBcode):
Private Sub Cmb_Entrée_Click()
'
Dim Wsh As Worksheet
Dim TblS As ListObject
Dim Cell As Range
Dim Found As Boolean
Dim NewRow As ListRow

    ' Définition de la feuille de calcul et du TS (Tableau Structuré)
    Set Wsh = Sheets("Tab_Pointage")        ' Nom de la feuille
    Set TblS = Wsh.ListObjects("t_Saisie")  ' Nom du TS

    Found = False

    ' On parcourt la 1ère colonne du TS pour rechercher la valeur de la Txt_Code
    ' puis on recherche la date du jour dans la 5e colonne
    For Each Cell In TblS.ListColumns(1).DataBodyRange

        If Cell.Value = Me.Txt_Code.Value And Cell.Offset(0, 4).Value = Me.TxB_DateJour Then
       
            Found = True

            ' On recherche la première cellule vide à partir de la 6ème colonne
            For i = 6 To TblS.ListColumns.Count
                If IsEmpty(Cell.Offset(0, i - 1)) Then
                    Cell.Offset(0, i - 1).Value = Format(Now, "hh:mm")
                    Exit For
                End If
            Next i

            Exit For

        End If

    Next Cell

    ' Si la valeur de Txt_Code n'est pas trouvée, on crée une nouvelle ligne
    If Not Found Then
        Set NewRow = TblS.ListRows.Add
        With NewRow
            .Range(1, 1).Value = Me.Txt_Code.Value
            .Range(1, 2).Value = Me.Txt_Noms.Value
            .Range(1, 3).Value = Me.Txt_Prénom.Value
            .Range(1, 4).Value = Me.Txt_NumSem.Value
            .Range(1, 5).Value = Format(Me.TxB_DateJour.Value, "dddd dd mmmm yyyy")
            .Range(1, 6).Value = Format(Now, "hh:mm")
        End With
    End If

End Sub
 

ChTi160

XLDnaute Barbatruc
Re
Je n'ai pas encore compris , mais ça va venir !
Le tableau est dans une feuille de l'un des fichiers qu'il a joint
Je pensais qu'il y aurait des tranches horaires de travail biens definies ,mais non !
Cela aurait été plus simple lol
(Depuis mon téléphone)
Jean marie
 

TooFatBoy

XLDnaute Barbatruc
Si c'est bien le cas, et si tu retrouve l'information en question, je suis preneur.
J'ai retrouvé. ;)

C'était là :
Oui, ça dépend à quelle heure l'employé arrive réellement.
Mais les trois tranches horaires du tableau sont en fait trois tranches tarifaires différentes.

Il y a donc les heures de travail qu'il faut comparer aux heures des tranches tarifaires, pour payer justement l'employé, si j'ai bien tout compris.

et ça faisait référence à ça :
Il y a une vingtaine d'employés, tous des saisonniers. Certains travaillent tous les jours, d'autres 4 ou 5 jours, tous dans la limite des 35 heures. Certains travaillent en continu (6:30 - 12:30 par exemple) et d'autres en plage de 4 heures. Ce n'est pas simple, de plus toutes les semaines sont différentes.
 

NONO14

XLDnaute Impliqué
Re
Je n'ai pas encore compris , mais ça va venir !
Le tableau est dans une feuille de l'un des fichiers qu'il a joint
Je pensais qu'il y aurait des tranches horaires de travail biens definies ,mais non !
Cela aurait été plus simple lol
(Depuis mon téléphone)
Jean marie
6h30 - 23h30 c'est l'amplitude de travail. Entre les deux tout est possible, il n'y a pas d'horaires fixes pour l'ensemble du personnel. Par contre, chaque individu aura un planning horaires qu'il devra, dans la mesure du possible, respecter. Les plannings seront différents chaque semaine.
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 222
Messages
2 107 468
Membres
109 836
dernier inscrit
SophieL16