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é
Je n'ai pas trouvé le parasite, alors le problème persiste
Je pense avoir résolu le problème avec cette procédure.
Dans l'éditeur Visual Basic, cliquez sur l'UserForm, lorsque la boite à outils s'affiche, fermez la et exécutez l'UserForm et le tour est joué. NB : Si la boite à outils ne s'affiche pas après avoir cliqué sur l'UserForm, affichez la dans l'onglet Affichage puis fermez et exécutez l'UserForm.
Pour le moment la boîte n'apparaît plus.
 

vgendron

XLDnaute Barbatruc
Voici le code qui fonctionne. Il n'est pas très joli, il y a certainement mieux à faire, mais il a le mérite de fonctionner.
Code:
Sub RempListBox()
Dim Ws As Worksheet
Dim Tbl As ListObject
Dim Cell As Range
Dim i As Long
Dim j As Long

    ' Définir la feuille et le tableau structuré
    Set Ws = Sheets("Tab_Pointage") 'Nom de la feuille
    Set Tbl = Ws.ListObjects("t_Saisie") ' Nom du tableau structuré

    ' Vider la ListBox
    UfPointage.Lst_Pointage.Clear

    ' Parcourir chaque ligne du tableau structuré et remplir la ListBox
   
    For i = 1 To Tbl.ListRows.Count
        With Tbl.ListRows(i).Range
           
            ' Ajouter une ligne vide à la ListBox
            UfPointage.Lst_Pointage.AddItem
           
            ' Remplir les colonnes de la ListBox avec les données des colonnes 5 à 10 du tableau
            For j = 1 To 6
                UfPointage.Lst_Pointage.List(UfPointage.Lst_Pointage.ListCount - 1, j - 1) = .Cells(1, j + 4).Text
            Next j
        End With
    Next i
End Sub
hello
ca marche vraiment ce truc??

VB:
Sub RempListBox()
Dim Ws As Worksheet
Dim Tbl As ListObject
Dim Cell As Range
Dim i As Long
Dim j As Long

    ' Définir la feuille et le tableau structuré
    Set Ws = Sheets("Tab_Pointage") 'Nom de la feuille
    Set Tbl = Ws.ListObjects("t_Saisie") ' Nom du tableau structuré

    ' Vider la ListBox
    UfPointage.Lst_Pointage.Clear

    ' Parcourir chaque ligne du tableau structuré et remplir la ListBox
    With Tbl
        For i = 1 To .ListRows.Count
            ' Ajouter une ligne vide à la ListBox
            UfPointage.Lst_Pointage.AddItem
            
            ' Remplir les colonnes de la ListBox avec les données des colonnes 5 à 10 du tableau
            For j = 1 To 6
                UfPointage.Lst_Pointage.List(UfPointage.Lst_Pointage.ListCount - 1, j - 1) = .DataBodyRange(i, j + 4).Text
            Next j
        Next i
    End With
End Sub
 

NONO14

XLDnaute Impliqué
hello
ca marche vraiment ce truc??

VB:
Sub RempListBox()
Dim Ws As Worksheet
Dim Tbl As ListObject
Dim Cell As Range
Dim i As Long
Dim j As Long

    ' Définir la feuille et le tableau structuré
    Set Ws = Sheets("Tab_Pointage") 'Nom de la feuille
    Set Tbl = Ws.ListObjects("t_Saisie") ' Nom du tableau structuré

    ' Vider la ListBox
    UfPointage.Lst_Pointage.Clear

    ' Parcourir chaque ligne du tableau structuré et remplir la ListBox
    With Tbl
        For i = 1 To .ListRows.Count
            ' Ajouter une ligne vide à la ListBox
            UfPointage.Lst_Pointage.AddItem
          
            ' Remplir les colonnes de la ListBox avec les données des colonnes 5 à 10 du tableau
            For j = 1 To 6
                UfPointage.Lst_Pointage.List(UfPointage.Lst_Pointage.ListCount - 1, j - 1) = .DataBodyRange(i, j + 4).Text
            Next j
        Next i
    End With
End Sub
Eh oui ;) J'ai fait ce que j'ai pu :rolleyes:
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
Comment utiliser ce code pour qu'il ne prenne les données de "t_Saisie" qu'à partir de la colonne Date jusqu'à la colonne L. En l'état, il colle toutes les données de la ligne depuis la colonne 1
Merci pour votre aide
VB:
Sub RempListeBox()

    UfPointage.Lst_Pointage.RowSource = Range("t_Saisie").Address(, , , True)

 End Sub
Le classeur qu je t'avais donné contenait déjà du code pour remplir la ListBox Lst_Pointage du UserForm ufPointage.
Pourquoi veux-tu le changer ? Il ne fonctionne pas ?



Franchement, tes noms de variables, de tableaux, d'objets dans les UserForm, et ici de macro, ne sont peut-être totalement optimisés... :(
"RempListeBox" ??? Ca remplit quelle ListBox ? 🤔
 
Dernière édition:

TooFatBoy

XLDnaute Barbatruc
J'ai réussi à faire ce code et il fonctionne. Qu'en penses-tu ?
VB:
Sub RempListBox()
Dim Ws As Worksheet
Dim Tbl As ListObject
Dim Cell As Range
Dim i As Long
Dim j As Long

    ' Définir la feuille et le tableau structuré
    Set Ws = Sheets("Tab_Pointage") ' Nom de la feuille
    Set Tbl = Ws.ListObjects("t_Saisie") ' Nom du tableau structuré

    ' Vider la ListBox
    UfPointage.Lst_Pointage.Clear

    ' Parcourir chaque ligne du tableau structuré et remplir la ListBox
    For i = 1 To Tbl.ListRows.Count
        With Tbl.ListRows(i).Range
            ' Ajouter une ligne vide à la ListBox
            UfPointage.Lst_Pointage.AddItem

            ' Remplir les colonnes de la ListBox avec les données des colonnes 5 à 10 du tableau
            For j = 1 To 6
                UfPointage.Lst_Pointage.List(UfPointage.Lst_Pointage.ListCount - 1, j - 1) = .Cells(1, j + 4).Text
            Next j

            ' Ajouter la valeur de la colonne 13 dans la 8ème colonne de la ListBox
            UfPointage.Lst_Pointage.List(UfPointage.Lst_Pointage.ListCount - 1, 7) = .Cells(1, 13).Text
        End With
    Next i
End Sub

Si je comprends bien, tu remplis la ListBox Lst_Pointage avec toutes les lignes du TS t_Saisie,.
Donc cette fois-ci tu ne filtres plus les lignes du TS servant à remplir la ListBox.

Du coup, tu sais déjà ce que j'en pense : il est totalement contre-productif de compliquer le code en écrivant une boucle inutile qui va en plus très probablement ralentir la macro, sans parler de la mise à jour du TS et de la ListBox.

Quant au code de ta macro, tu as bien vu que je ne procède pas du tout comme ça puisque je ne spécifie pas la feuille sur laquelle il se trouve.
 
Dernière édition:

NONO14

XLDnaute Impliqué
Si je comprends bien, tu remplis la ListBox Lst_Pointage avec toutes les lignes du TS t_Saisie,.
Donc cette fois-ci tu ne filtres plus les lignes du TS servant à remplir la ListBox.

Du coup, tu sais déjà ce que j'en pense : il est totalement contre-productif de compliquer le code en écrivant une boucle inutile qui va en plus très probablement ralentir la macro, sans parler de la mise à jour du TS et de la ListBox.

Quant au code de ta macro, tu as bien vu que je ne procède pas du tout comme ça puisque je ne spécifie pas la feuille sur laquelle il se trouve.
Bonsoir
Je sais que mon travail n'est pas très conventionnel, mais j'ai essayé de sortir quelque chose avec mes connaissances, mes livres et quelques tutoriel sur internet. Je n'ai certainement pas vos connaissances, et je fais de mon mieux. Je ne demande qu'à me perfectionner et je ne peux pas toujours me tourner vers vous car vous avez sans doute autre chose à faire. Quand je dis vous, je parle de tous les intervenants.
Merci à tous.
 

TooFatBoy

XLDnaute Barbatruc
Je disais simplement que je trouve que, par exemple, tes noms de variables ne sont pas forcément très clairs. Mais chacun a ses petite habitudes, et pas besoin d'avoir des connaissances en quoi que ce soit. ;)

Tu me demandes ce que je pense de ton code, je te réponds simplement que tu as bien vu dans les codes que j'ai postés que je ne procède pas de la même façon pour faire la même chose.
Mais en programmation on a souvent plusieurs solutions, et là aussi chacun ses petites habitudes. ;)
 

TooFatBoy

XLDnaute Barbatruc
J'ai un peu regardé ta version 4.

- Quand les six pointages sont remplis, les boutons "Valider", "Modifier", "Annuler" disparaissent sans raison apparemment valable.

- Pourquoi avoir inversé les colonnes "Date" et "Semaine" entre les TS t_Saisie de la feuille Tab_Pointage, et le TS t_Import de la feuille Import_Pointage ?

- Les "dates" du TS t_Saisie sont toujours des textes et non des dates, et donc celles de t_Import aussi.

- Le clic sur une ligne de la ListBox provoque maintenant une erreur, ce qui n'était pas le cas précédemment.
Normal vu que tu as Rw.Range(1, 2).Select qui ne sert à rien et qui ne peut fonctionner vu que ce n'est pas la bonne feuille qui est active.

- Le Application.EnableEvents = False ne sert à rien ici.

- Après la validation d'une modification d'un pointage tu remplis, comme je le disais précédemment, la ListBox Lst_Pointage avec toutes les lignes du TS t_Saisie, alors que les données de l'employé sont toujours visibles, laissant croire que tous les pointages de la ListBox sont les siens.
 

NONO14

XLDnaute Impliqué
J'ai un peu regardé ta version 4.

- Quand les six pointages sont remplis, les boutons "Valider", "Modifier", "Annuler" disparaissent sans raison apparemment valable.

- Pourquoi avoir inversé les colonnes "Date" et "Semaine" entre les TS t_Saisie de la feuille Tab_Pointage, et le TS t_Import de la feuille Import_Pointage ?

- Les "dates" du TS t_Saisie sont toujours des textes et non des dates, et donc celles de t_Import aussi.

- Le clic sur une ligne de la ListBox provoque maintenant une erreur, ce qui n'était pas le cas précédemment.
Normal vu que tu as Rw.Range(1, 2).Select qui ne sert à rien et qui ne peut fonctionner vu que ce n'est pas la bonne feuille qui est active.

- Le Application.EnableEvents = False ne sert à rien ici.

- Après la validation d'une modification d'un pointage tu remplis, comme je le disais précédemment, la ListBox Lst_Pointage avec toutes les lignes du TS t_Saisie, alors que les données de l'employé sont toujours visibles, laissant croire que tous les pointages de la ListBox sont les siens.
Bonjour TooFatBoy,
Je suis nullement fâché à cause de tes propos, mais après moi car je n'avance pas comme je le souhaite. Je ne peux me concentrer plus d'une heure ou deux sur mon travail et c'est fatiguant. Je vais regarder tes remarques et régler les problèmes.
Pour le 1 - c'est normal.
Pour le 2 - Faute d'inattention
Pour le 3 - Je vais modifier le format
Pour le 4 - Je n'ai pas remarqué ce soucis, je vais regarder
Pour le 5 - Je vais le supprimer
Pour le 6 - Là ce n'est pas bon, pourtant je n'ai pas touché au code, au moins je le crois !!!
Encore toutes mes excuses si mon écrit a pu de fâcher, mais ce n'est nullement envers toi ou qui que ce soit d'autre. Je ne sais même pas si je vais avoir le temps de terminer avant mon hospitalisation. Je fais de mon mieux.
A plus tard, et encore mille excuses et remerciements
René
 

TooFatBoy

XLDnaute Barbatruc
Pour le 1 - c'est normal.
Ok. Donc ça veut dire que le but du bouton "Modifier" est d'ajouter un pointage, mais pas de modifier l'heure d'un des pointages réalisés, si je comprends bien.
Du coup, au niveau des six TxtBox, il faudrait mettre en Disable les TxtBox remplies, et mettre en Enable uniquement TxtBox vides.

Pour le 6 - Là ce n'est pas bon, pourtant je n'ai pas touché au code, au moins je le crois !!!
C'est toi qui l'a écrit. Du moins... il me semble. 😉
 
Dernière édition:

NONO14

XLDnaute Impliqué
Ok. Donc çacveut dire que le but du bouton "Modifier" est d'ajouter un pointage, mais pas de modifier l'heure d'un des pointages réalisés, si je comprends bien.
Du coup, au niveau des six TxtBox, il faudrait mettre en Disable les TxtBox remplies, et mettre en Enable uniquement TxtBox vides.


C'est toi qui l'a écrit. Du moins... il me semble. 😉
Pas tout à fait, ça veut dire que l'on modifie les pointages au-fur et à mesure, une fois tout rempli, il est trop tard.
 

Discussions similaires

Statistiques des forums

Discussions
315 094
Messages
2 116 155
Membres
112 671
dernier inscrit
Sylvain14