Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

TooFatBoy

XLDnaute Barbatruc
t'as quand meme pas 50 colonnes??

sinon.. bah.. une boucle..

VB:
for j=1 to .listcolumns.count
    .databodyrange(.listrows.count,j)=now
next j
Je crois qu'il y a une seule cellule à remplir, et non toutes les colonnes du TS, et il faut commencer par trouver la première des six colonnes dont la cellule est vide et c'est elle qu'il faut remplir avec Now modulo 1.
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re
Bonjour vgendron
ce que j'ai utilisé !
VB:
Sub Test()
Dim LstR As Object
With Range("t_BDD").ListObject
  With .Parent
         .Unprotect "falaise"
  End With
  If Not .DataBodyRange Is Nothing Then
       Set LstR = .ListRows.Add
       With LstR
              .Range(5).Value = NuméroSemaine(Date)
              .Range(6).Value = Date
       End With
      Else
         Set LstR = .ListRows.Add
       With LstR
              .Range(5).Value = NuméroSemaine(Date)
              .Range(6).Value = Date
       End With
   End If
  With .Parent
         .Protect "falaise"
  End With
 End With
End Sub
Bonne Journée
jean marie
 

Pièces jointes

  • Nono14-5.gif
    109.7 KB · Affichages: 6

NONO14

XLDnaute Impliqué
Je crois qu'il y a une seule cellule à remplir, et non toutes les colonnes du TS, et il faut commencer par trouver la première des six colonnes dont la cellule est vide et c'est elle qu'il faut remplir avec Now modulo 1.
Si il n'y a eu aucun pointage, c'est toutes les colonnes d'avant sur la ligne qu'il faut remplir, c'est-à-dire les colonnes 1 à 5 et la 6. Sinon, oui c'est à partir de la colonne 6 la première cellule vide.
 

NONO14

XLDnaute Impliqué
Merci jean marie. Je vais essayer de l'adapter à mon travail.
 

ChTi160

XLDnaute Barbatruc
Re
Si il n'y a eu aucun pointage, c'est toutes les colonnes d'avant sur la ligne qu'il faut remplir,
c'est le But
c'est-à-dire les colonnes 1 à 5 et la 6. Sinon, oui c'est à partir de la colonne 6 la première cellule vide.
la Ligne qui sera ajoutée , tiens compte de la Dernière Ligne ou il y a des données (Tableau Structuré) donc pas de référence particulière a la Colonne 6 !
Jean marie
 

NONO14

XLDnaute Impliqué
Voilà, j'ai fait ça et ça fonctionne. Ce n'est certainement pas très joli, mais ça fait le travail.
Juste un petit soucis, ça me créé systématiquement une nouvelle ligne mais vide.

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
    Set NewRow = TblS.ListRows.Add
    
    Found = False

'On parcourt la 1ère colonne du TS pour rechercher la valeur de la Txt_Code
   For Each Cell In TblS.ListColumns(1).DataBodyRange
    If Cell.Value = Me.Txt_Code Then
        Found = True

'Si il existe        
'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
        With NewRow
            .Range(1, 1).Value = Me.Txt_Code.Value '1ère colonne
            .Range(1, 2).Value = Me.Txt_Noms.Value '2ème colonne
            .Range(1, 3).Value = Me.Txt_Prénom.Value '3ème colonne
            .Range(1, 4).Value = Me.Txt_NumSem.Value '4ème colonne
            .Range(1, 5).Value = Format(Me.TxB_DateJour.Value, "dddd dd mmmm yyyy") '5ème colonne
            .Range(1, 6).Value = Format(Now, "hh:mm") '6ème colonne
        End With
    End If
End Sub
 

TooFatBoy

XLDnaute Barbatruc
T'as pas un "Exit For" en trop ?

[edit]
Non, pas de "Exit For" en trop. C'est l'indentation farfelue qui m'a enduit d'erreur...
N'hésite pas à utiliser une indentation correcte, ça rendra ton code plus lisible.
[/edit]


Au fait, sais-tu qu'il existe d'autres boucles comme par exemple "While" ou "Until" ?
 
Dernière édition:

NONO14

XLDnaute Impliqué
Non je ne connais pas While et Until.
Pour le Exit For je vais en enlever un.
 

TooFatBoy

XLDnaute Barbatruc
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 ?
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…