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 :

Calcul d'une nouvelle date en tenant compte des jours ferie


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    responsable de site
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : responsable de site
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Calcul d'une nouvelle date en tenant compte des jours ferie
    Bonjour

    Je cherche depuis quelque jours a calculer une date de fin en prenant une date et une heure de début et en rajoutant un nombre d'heure tout en prenant en compte le nombre d'heure de travail par jours ouvrable.

    exemple : 01/08/2013 10:00 temps d'intervention 100 heures (12 jours et 4 heure ouvrable) résultat 20/08/2013 14:00

    Merci pour votre aides

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour,

    Connais-tu cette Q/R de la FAQ
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  3. #3
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Hello
    pour cette opération, je passe par une table calendrier qui m'est propre et qui contient les infos dont j'ai besoin: les jours (dates), s'ils sont ouvrés, s'ils sont travaillés, le nombre d'heures travaillées ce jour, etc
    ensuite, je pointe sur un des jours de l'intervalle (début ou fin au choix) et je me déplace, enregistrement par enregistrement jusqu'à l'autre en comptant ce que j'ai envie de compter: des jours calendaires, des jours ouvrés, des heures, des minutes, enfin ce que je veux!
    en espérant avoir aidé
    -------------------Simplifi----------comme si tout était simple--------

  4. #4
    Futur Membre du Club
    Homme Profil pro
    responsable de site
    Inscrit en
    Février 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : responsable de site
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Bonsoir

    Etant débutant en VBA pourriez vous me conseiller sur la manière de rédiger c'est ligne de procedure

    merci d'avance a tous

  5. #5
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Hello
    exemple de programmation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Set Cal = CurrentDb.OpenRecordset("SELECT * FROM Calendrier ORDER BY Jour_cal;")  'on charge le calendrier
        Cal.MoveLast
        Cal.MoveFirst
        Cal.Move Fin - Cal("jour_cal") 'comme on peut pas faire un find, on fait un move calculé
        ATTENTE = 2 'nb  de jours de sécurité avant le délai
                Do Until ATTENTE = 0                                            ' comme on ne peut pas retrancher les jours
                    Cal.MovePrevious                                            ' on doit redescendre dans le calendrier
                    If Cal("ouvré") Then ATTENTE = ATTENTE - 1                  ' si jour ouvré, on compte
                    Délai_op_préc = Cal("jour_cal")
                Loop
    ici, je trouve le jour travaillé (dans ma table) situé deux jours avant le délai

    en espérant aider
    -------------------Simplifi----------comme si tout était simple--------

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2010
    Messages
    801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2010
    Messages : 801
    Points : 1 107
    Points
    1 107
    Par défaut
    Bonjour, si jamais ça pouvait t'aider, j'utilise souvent ce code que j'ai trouvé (si ma mémoire est bonne) sur officesystemaccess.seneque.net :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    Option Compare Database
    Option Explicit
     
    'Permet de conserver sans recalcul les jours fériés mobiles de l'année en cours
    Private Type tJoursFete
       sLundiPaques As String
       sAscension As String
       sLundiPentecote As String
       iAnnee As Integer
    End Type
     
    Private tFetes As tJoursFete
     
    'Détermine les jours fériés liés à pâques
    Private Sub SetJoursDeFete(ByVal iAn As Integer)
       Dim L(1 To 5) As Long, Lj As Long, Lm As Long
       Dim dPaques As Date
     
       L(1) = iAn Mod 19
       L(2) = iAn Mod 4
       L(3) = iAn Mod 7
       L(4) = (19 * L(1) + 24) Mod 30
       L(5) = (2 * L(2) + 4 * L(3) + 6 * L(4) + 5) Mod 7
       Lj = 22 + L(4) + L(5)
     
       If Lj > 31 Then
          Lj = Lj - 31
          Lm = 4
       Else
          Lm = 3
       End If
     
       dPaques = DateSerial(iAn, Lm, Lj)
       tFetes.sLundiPaques = Format(dPaques + 1, "ddmm")
       tFetes.sAscension = Format(dPaques + 39, "ddmm")
       tFetes.sLundiPentecote = Format(dPaques + 50, "ddmm")
       tFetes.iAnnee = iAn 'v1.01 : Evite recalcul pour chaque année
    End Sub
     
    ' Retourne vrai si la date est un jour férié ou éventuellement samedi ou dimanche
    ' Ascension, lundi de Pâques, Lundi de Pentecôte, 1er janvier, 1er mai, 8 mai
    ' 14 juillet, 15 aout, 1er novembre, 11 novembre, 25 décembre
    Public Function IsJourFerie(ByVal dDate As Date, Optional ByVal bWeekEnd As Boolean) As Boolean
       If bWeekEnd Then
          Select Case WeekDay(dDate)
          Case vbSunday, vbSaturday
             IsJourFerie = True
          End Select
       End If
       If Not IsJourFerie Then
          If tFetes.iAnnee <> Year(dDate) Then SetJoursDeFete (Year(dDate))
          Select Case Format(dDate, "ddmm")
          Case tFetes.sAscension, tFetes.sLundiPaques, tFetes.sLundiPentecote, "0101", "0105", "0805", "1407", "1508", "0111", "1111", "2512"
             IsJourFerie = True
          End Select
       End If
    End Function
     
    Function DernierJourTravaillé(DteDate As Date) As Date
    '
    ' Renvoie la date du dernier jour ouvré (Lun-Ven) d'un mois.
    '
        Dim D2 As Date
        If VarType(DteDate) <> 7 Then
            DernierJourTravaillé = Null
        Else
            D2 = DateSerial(Year(DteDate), Month(DteDate) + 1, 0)
            Do While WeekDay(D2) = 1 Or WeekDay(D2) = 7
                D2 = D2 - 1
            Loop
            DernierJourTravaillé = D2
        End If
     
    End Function
     
    Public Function JoursOuvrables(Date_Début As Variant, Date_Fin As Variant) As Integer
    '
    ' Cette fonction calcule le nombre de jours ouvrables entre deux dates
    ' Samedi n'est pas ouvrable, Dimanche est férié
    '
        If IsNull(Date_Début) Or IsNull(Date_Fin) Then
            JoursOuvrables = 0
            Exit Function
        End If
     
        Dim Ma_Date As Date
     
        Ma_Date = Date_Début
        Do Until Ma_Date > Date_Fin
            Select Case WeekDay(Ma_Date)
                Case 2, 3, 4, 5, 6
                    Select Case IsJourFerie(Ma_Date, False)
                        Case True
                        Case Else
                            JoursOuvrables = JoursOuvrables + 1
                    End Select
            End Select
            Ma_Date = Ma_Date + 1
        Loop
     
    End Function
    L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!

  7. #7
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    Hello
    j'ai bien lu différentes routines permettant de calculer les jours fériés!
    néanmoins, je persiste à utiliser une table qui me permet de donner le plus simplement possible l'information que tel ou tel jour n'est pas travaillé dans l'entreprise (jour de la fête locale, de l'anniversaire de l'entreprise, etc)
    Cette même table peut aussi servir à spécifier le nombre d'heures journalier.

    bien sûr, il est judicieux d'avoir la colonne qui spécifie le jour férié au sens de la loi !

    enfin, un petit bouton sur le formulaire, permet de rajouter un an à la table...
    et un autre bouton pour nettoyer le passer (plus de dix ans, est ce bien nécessaire?)
    -------------------Simplifi----------comme si tout était simple--------

Discussions similaires

  1. Déplacement Date en tenant compte des FDS
    Par Beaudelicius dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/08/2012, 15h13
  2. [AC-2010] Ajout une nouvelle date 1mois de plus
    Par Commandeur dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/04/2011, 18h17
  3. Réponses: 9
    Dernier message: 17/02/2011, 17h14
  4. ajouter 2ans à une date et avoir une nouvelle date
    Par sajodia dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/12/2008, 13h20
  5. Réponses: 6
    Dernier message: 20/02/2007, 10h54

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