Saisie de temps dans un calendrier avec un bouton

Bonjour,

Je cherche une solution pour faire une interface de saisie de temps via deux bouton.

Dans le fichier joins, dans la feuille "interface" j'ai deux bouton "entrée" et "sortie".

Je souhaiterai lors d'un appuis sur l'un ou l'autre qu'il recherche la date du jour "I2" dans les autres feuille (Feuil4 ; Feuil4 (2) ) pour renseigné l'heur actuel "H2" dans la colonne "D" pour le BP "entrée" et colonne "E" pour le BP "sortie" dans autres feuille (Feuil4 ; Feuil4 (2) ).

Dans mon fichier finale, j'aurais 40 feuille lors de ma recherche.

merci

12test.xlsm (29.83 Ko)

A tester :

Bonjour Eric,

Merci de ton retour rapide!

J'ai testé ta proposition, elle fonctionne comme tu l'as prévu (avec le nom de la feuille).

Mais dans mon application définitive, je ne serai pas quel sera la feuille qui contiendra la date du jour. Dans le test que j'ai fais, il consistait a changer la date "B1" de la feuille "2023-05" avec la valeur 1/04/23 et sur la feuille "2023-06" avec la valeur 1/05/23. Dans ce cas, la macro ne trouve pas la date.

J'ai regarder le code que tu me propose, je ne le comprend pas complètement et j'aurai besoin d'explication si possible:

Option Explicit
' Actualisation de l'heure
Sub MajHeureArrivee(ByVal DateJour As Date, ByVal HeureArrivee As Variant)

'Decalaction des variables
Dim NomOnglet As String                          'Nom de la feuille de recherche
Dim I As Integer, J As Integer                   '"I" Index pour premiere boucle FOR    "J" Index pour deuxieme boucle FOR
Dim AireDates As Range, AireArrivee As Range     ' ?

    NomOnglet = Format(Year(DateJour), "0000") & "-" & Format(Month(DateJour), "00")    'Possible de mettre directement la cellule contenant le nom de la feuille
    For I = 1 To Sheets.Count
        With Sheets(I)
            If .Name = NomOnglet Then
               Set AireDates = .ListObjects(1).ListColumns("Date").DataBodyRange
               Set AireArrivee = .ListObjects(1).ListColumns("Arrivée").DataBodyRange
               For J = 1 To AireDates.Count
                   If CDate(AireDates(J)) = DateJour Then AireArrivee(J) = HeureArrivee
               Next J
               AireArrivee.NumberFormat = "hh:mm"
               Set AireDates = Nothing: Set AireArrivee = Nothing
            End If
        End With
    Next I

End Sub

Sub TestMajHeureArrivee()           ' Quel est l'objectif de ce test?

    Range("HeureArrivee") = Now()
    MajHeureArrivee CDate(Range("DateActuelle")), Range("HeureArrivee")

End Sub

C'est pour cela que je souhaitai chercher la date dans chaque feuille, si cela est possible bien sur. Si non, je peut trouvé avec une formule "RechercheX" le nom de la feuille

A quoi sert le Module 2?

Dans la tente de tes commentaire, je te remercie de ton aide.

Jessy

Edit : A quoi sert le Module 2?

A rien.

Sinon, si une date de l'année doit être recherchée, cela suppose implicitement que les 12 onglets de l'année existent a minima.

La boucle For I... balaye tous les onglets pour trouver la date, dont à un moment la date va être trouvée dans un des onglets.

Bonjour Eric,

Oui effectivement, mon fichier définitif aura même 40 onglet. Mais le nom des onglets ne comportera pas la date (Mois n°1; Mois n°2; ....)

Vue que la recherche est baser sur le nom de l'onglet, j'ai fais une modification sur la définition de la variable "NomOnglet" pour que cela fonctionne.

' Actualisation de l'heure
Sub MajHeureArrivee(ByVal DateJour As Date, ByVal HeureArrivee As Variant)

'Decalaction des variables
Dim NomOnglet As String                          'Nom de la feuille de recherche
Dim I As Integer, J As Integer                   '"I" Index pour premiere boucle FOR    "J" Index pour deuxieme boucle FOR
Dim AireDates As Range, AireArrivee As Range     ' ?

    NomOnglet = Worksheets("Interface").Range("J3").Value
    'NomOnglet = Format(Year(DateJour), "0000") & "-" & Format(Month(DateJour), "00")    'Possible de mettre directement la cellule contenant le nom de la feuille
    For I = 1 To Sheets.Count
        With Sheets(I)
            If .Name = NomOnglet Then
               Set AireDates = .ListObjects(1).ListColumns("Date").DataBodyRange
               Set AireArrivee = .ListObjects(1).ListColumns("Arrivée").DataBodyRange
               For J = 1 To AireDates.Count
                   If CDate(AireDates(J)) = DateJour Then AireArrivee(J) = HeureArrivee
               Next J
               AireArrivee.NumberFormat = "hh:mm"
               Set AireDates = Nothing: Set AireArrivee = Nothing
            End If
        End With
    Next I

End Sub

Il me reste plus cas reproduire ton code dans mon fichier définitif.

Je te remercie de ton aide.

Cordiallement

Jessy

Bonjour Eric,

Je regarde pour utiliser ta solution dans mon fichier définitif.

Au moment du lancement de la macro via le bouton, je bloque sur cette ligne "Set AireDates = .ListObjects(1).ListColumns("Date").DataBodyRange".

Je cherche a comprendre a quoi correspond chaque élément. Peut tu me les expliquer?

J'ai vérifier toute les cellules nommé, dans le gestionnaire de nom.

Il y a juste "t_2023_05" et "t_2023_06", qui fond partie d'une requêtes. Mais je ne sais pas si cela est la source de mon problème.

Je commence juste sur le VBA, donc j'ai beaucoup de chose a apprendre.

Merci

Chaque onglet ( 2023-05, 06, ...) possède au plus 1 tableau structuré (en VBA ListObject). J'utilise la méthode de Pierre FAUCONNIER pour nommer un tableau structuré : "t_" suivi d'un nom explicite. Cela permet de repérer ces zones plus facilement que les icônes dans le gestionnaire de noms. Donc l'onglet 2023-05 contient le tableau structuré t_202305 et ainsi de suite.

La ligne ci-dessous fait partie du balayage des onglets.

With Sheets(I)
      Set AireDates = .ListObjects(1).ListColumns("Date").DataBodyRange
End With

Comme on balaye chaque onglet, on ne peut pas faire appel directement au nom du tableau structuré, on prend seulement le premier tableau de la collection des tableaux structurés "ListObjects(1)". Ensuite on définit le Range AireDates en prenant le nom de la colonne du tableau structuré "ListColumns("Date") et on ne prend que la partie données "DataBodyRange".

Bonjour Eric,

Merci pour tes explications, elle m'ont permit de finir ce que je souhaitais faire!

J'ai une dernière question, si tu as encore un peut de temps.

Je souhaiterai avoir cette interface sur un fichier Excel indépendant. L'objectif est d'avoir 4 bouton "entrée" et 4 bouton "sortie" pour remplir les heures sur 4 fichier identique.

Le principe serait de créer une macro complémentaire (Jessy.xlam par exemple) et qu'elle apparaisse dans le menu des compléments d'Excel.

capture

En cliquant sur Jessy, nous aurions la possibilité de saisir des heures, si un fichier de saisie répertorié dans un onglet Paramètres de la macro complémentaire, est ouvert.

Sinon :

capture2

Si un fichier de saisie (et un seul) est ouvert, une boite de dialogue s'ouvrirait et les heures pourraient être saisies :

capture4 capture5
Rechercher des sujets similaires à "saisie temps calendrier bouton"