IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Nombre de demi-jours entre deux dates avec contraintes


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de DamKre
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2007
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2007
    Messages : 495
    Par défaut Nombre de demi-jours entre deux dates avec contraintes
    Bonjour,

    J'ai une nouvelle fois besoin de vos lumières.
    Il s'agit de calculer le nombre de demi-jours entre deux dates.
    Il y a la fonction datediff ( là, aucun souci ) pour le nombre de jours entre deux dates ; cependant, des demi-jours seront à extraire au calcul...

    Le contexte

    Il s'agit de stocker les exclusions d'un élève ( l'élève ne peut plus aller en cours, car il a fait quelque chose de grave ).
    Les exclusions se calculent en demi-jours. Ainsi, s'il est exclu...
    • un lundi toute la journée -> deux demi-jours
    • un lundi matin -> un demi-jour
    • un lundi après-midi -> un demi-jour
    • un mercredi -> un demi-jour ( en Belgique, il n'y a pas cours le mercredi après-midi ).


    La table

    Les champs de la table concernés pour ce calcul sont :
    • Id_EJE ( numéro auto )
    • Id_Ele ( numérique )
    • EJE_Debut_Date ( date )
    • EJE_Debut_Moment ( texte / choix entre 1-matin; 2-après-midi;3-journée )
    • EJE_Fin_Date ( date )
    • EJE_Fin_Moment ( texte / choix entre 1-matin; 2-après-midi;3-journée )
    • EJE_DemiJours ( numérique )



    Le formulaire

    Voici un aperçu du (sous-)formulaire d'encodage :
    Nom : DvP_NbreDemiJours.png
Affichages : 281
Taille : 5,5 Ko

    En encodant la date :
    • s'il s'agit d'un mercredi, la valeur "moment" est réglée sur matin ;
    • s'il s'agit d'un samedi ou d'un dimanche, un message avertit l'utilisateur de choisir une autre date.



    Le "problème"

    Lorsque deux dates sont encodées, il faut donc calculer le nombre de demi-jours, en tenant compte du moment ( matin/après-midi/journée ) et en excluant:
    • les mercredi après-midi
    • les samedis ( pas école )
    • les dimanches
    • les jours fériés ( idéalement )


    Voici dès lors des exemples pour donner une idée des résultats attendus :

    Début
    (moment)
    Fin
    (moment)
    Demi-jours
    Commentaires
    Lundi 01/09 matin 1
    Lundi 01/09 matin Mardi 02/09 après-midi 4
    Lundi 01/09 après-midi Mardi 02/09 après-midi 3
    Mercredi 03/09 matin Vendredi 05/09 après-midi 5 congé mercredi après-midi
    Vendredi 05/09 matin Lundi 08/09 matin 3 on décompte samedi et dimanche
    Lundi 30/04 matin Mercredi 02/05 matin 3 congé le 01/05


    Pour calculer le nombre de jours, voici ce que j'ai commencé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Private Sub CalculNombreDemiJours()
    On Error GoTo Erreurs
     
    If Nz(Me!EJE_Fin_Date, "") = "" Then
        'Une seule date
        Select Case Me!EJE_Debut_Moment
            Case 1 'Matin
                Me!EJE_DemiJours = 1
            Case 2 'Après-midi
                Me!EJE_DemiJours = 1
            Case 3 'Journée
                Me!EJE_DemiJours = 2
            Case Else 'Moment non-défini
                If Weekday(Me!EJE_Debut_Date, vbMonday) = 3 Then
                    'Mercredi -> Matin
                    MsgBox "Le moment du premier jour d'exclusion n'a pas été défini." & vbCrLf & "Il s'agit d'un mercredi." & vbCrLf & "L'élève sera exclu dès lors le matin uniquement.", vbInformation
                    Me!EJE_Debut_Moment = 1
                    Me!EJE_DemiJours = 1
                Else
                    'Autre jour -> Journée
                    MsgBox "Le moment du premier jour d'exclusion n'a pas été défini." & vbCrLf & "L'élève sera considéré comme exclu toute la journée.", vbInformation
                    Me!EJE_Debut_Moment = 3
                    Me!EJE_DemiJours = 2
                End If
        End Select
    Else
        Select Case Me!EJE_Fin_Moment
            Case 1 'Matin
     
            Case 2 'Après-midi
     
            Case 3 'Journée
     
            Case Else 'Moment non-défini
        End Select
    End If
    Cela fonctionne bien en cas d'une seule date.


    Comment calculeriez-vous le nombre de demi-jours entre deux dates, en tenant compte des moments ?
    Merci de votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    Salut,

    tu peux faire une fonction avec 2 parametres : la date, la demi journee, retournant un booleen



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function DemiJourneeOK(dt As Date, AM0PM1 as Integer) As Boolean
    Select Case WeekDay(dt)
    ...
    End Select
    End If
    Tu pourras faire une fonction avec double boucle
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim dt As Date
    Dim total as Integer
    total=0
    For dt=#09/01/2017# To #10/01/2017#
    For i = 0 To 1
    If DemiJourneeOK(dt,i) Then
    total = total+1
    End If
    Next i
    Next dt
    Msgbox total
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre éclairé
    Avatar de DamKre
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2007
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2007
    Messages : 495
    Par défaut
    Bonjour et merci de ta réponse.

    Édition :

    Je pense avoir compris le principe de la boucle.
    Faire comme ceci est-il donc correct ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Dim Var_Date As Date
    Dim Var_DemiJour As Long
     
    'Boucle pour lire chaque jour
    For Var_Date = Me!EJE_Debut_Date To Me!EJE_Fin_Date
        Select Case Weekday(Var_Date, vbMonday)
            Case 1, 2, 4, 5 'Lundi, Mardi, Jeudi, Vendredi -> 2 demi-jours
                Var_DemiJour = Var_DemiJour + 2
            Case 3 'Mercredi -> 1 demi-jour
                Var_DemiJour = Var_DemiJour + 1
            Case 6, 7 'Samedi, Dimanche -> un demi-jour
                Var_DemiJour = Var_DemiJour + 0
        End Select
    Next Var_Date
     
    'Retirer un demi-jour si l'élève a été exclu le matin, SAUF si c'est un mercredi
    If (Me!EJE_Debut_Moment = 2 And Weekday(Me!EJE_Debut_Date, vbMonday) <> 3) Then Var_DemiJour = Var_DemiJour - 1
    'Retirer un demi-jour si l'élève est de retour l'après-midi du dernier jour
    If Me!EJE_Fin_Moment = 1 Then Var_DemiJour = Var_DemiJour - 1
     
    Me!EJE_DemiJours = Var_DemiJour

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Par défaut
    Bonjour,

    Une proposition

    Regarde ici : http://claudeleloup.developpez.com/t...plic-ploc/#LIV
    pour te créer (une fois pour an) deux tables :
    - les jours complets d’école (lundis, mardis, jeudis et vendredis ouvrables) ;
    - les mercredis d’école.
    N.B. On pourrait adapter en ajoutant un algorithme pour le calcul des fêtes mobiles (celles basées sur Pâque) et une table pour les périodes de vacances scolaires.
    Pour le calcul des demi-jours d’exclusion :
    - le 1er jour compte pour 2 si matin et pas mercredi (sinon compte pour 1) ;
    - le dernier jour compte pour 1 si matin ou mercredi (sinon 2) ;
    - pour les jours entre, on pourrait s’inspirer de la fonction décrite ici http://claudeleloup.developpez.com/t...ic-ploc/#LIV-D
    que l’on pourrait dédoubler mercredis/autres jours qui valent respectivement 1 et 2.
    Jour de départ = début + 1 ; Jour d’arrivée = dernier jour-1.

Discussions similaires

  1. Nombre de jours entre deux dates avec Calendar
    Par SixtyFourWarrior dans le forum Android
    Réponses: 3
    Dernier message: 07/02/2017, 17h32
  2. Réponses: 2
    Dernier message: 29/05/2006, 19h16
  3. [MS-DOS] Compter les nombres de jours entre deux dates diffé
    Par Furius dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 19/02/2006, 13h33
  4. nombre de jours entre deux date
    Par mzt.insat dans le forum Langage
    Réponses: 13
    Dernier message: 01/02/2006, 10h34
  5. [Dates] Nombre de jours entre deux dates
    Par cmoiscrat dans le forum Langage
    Réponses: 3
    Dernier message: 22/09/2005, 15h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo