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

Access Discussion :

datediff sans week end


Sujet :

Access

  1. #1
    Membre régulier Avatar de omen123
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Septembre 2015
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2015
    Messages : 354
    Points : 107
    Points
    107
    Par défaut datediff sans week end
    bonjour les amis

    je sais bien que ma question a déjà été posée,mais j'arrive pas à trouver la bonne formule .je voudrai calcluer le nombre de jour ouvré (sans compter le week end) j'ai fait la manip suivante :

    delai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DiffDate("j";[date1];[date2);(vbMonday];([vbFriday]))
    merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 770
    Points : 14 812
    Points
    14 812
    Par défaut
    Bonsoir,
    à première vue, il y a des erreurs de syntaxe : les crochets, c'est pour délimiter les noms des tables et des champs uniquement, pas les variables ni les fonctions intégrées. Les parenthèses en trop n'arrangeant pas non plus la syntaxe ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DiffDate("j";[date1];[date2];vbMonday;vbFriday)

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 359
    Points : 23 829
    Points
    23 829
    Par défaut
    Bonjour.

    Autant que je sache DateDiff() ne permet pas ce genre de calcul.
    Voir l'aide associé à la fonction.

    Les solutions que je vois sont
    1. de programmer toi-même le calcul du nombre de jour, en passant chaque jour entre tes 2 dates en revue et en comptant les jours qui t'intéressent.
    2. Ou de faire une approximation du nombre de jours de congés :

      Un truc du genre
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      DateDiif("j"; [Date1]; [date2]) - (int(DateDiif("j"; [Date1]; [date2]) /7) * 2)
      (À valider c'est une intuition pas une solution éprouvée.)


    Personnellement, j'irai avec la 1ère solution qui est assez simple à mettre en œuvre et qui me semble poser moins de problème de calcul.

    A+

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    une fonction vba à tester (ne tient pas compte des jours fériés éventuels) :
    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
     
    Public Function WorkDays(ByVal startDate As Date, ByVal endDate As Date) As Long 
    'Returns the number of workdays (monday to friday) between two dates 
    'startDate must be >= #30/12/1899# 
    'Author : Philben - 06/06/2012 - v1.01 - Free to use 
       Dim d As Long, r As Long, wd As Long, w As Long 
     
       d = DateDiff("d", startDate, endDate) + 1 
       r = d Mod 7 
       wd = Int(d / 7) * 5 + r 
     
       If r > 0 Then 
          w = 7 - Weekday(startDate, vbMonday) 
          If r >= w Then wd = wd + (w <> 0 And w <> r) - 1 
       End If 
     
       WorkDays = wd 
    End Function
    Cordialement

    Philippe

  5. #5
    Membre régulier Avatar de omen123
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Septembre 2015
    Messages
    354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2015
    Messages : 354
    Points : 107
    Points
    107
    Par défaut
    bonjour les amis
    j'ai trouvé la solution voila j'ai cree un module :



    Option Compare Database
    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
     
    Function Work_Days(BegDate As Variant, EndDate As Variant, _
                       Optional bAvecJFerie As Boolean = False) As Variant
        Dim dt As Date
     
    On Error GoTo Work_Days_Error
        If IsNull(BegDate) Or IsNull(EndDate) Then Err.Raise vbObjectError + 1
        If Not IsDate(BegDate) Or Not IsDate(EndDate) Then Err.Raise vbObjectError + 2
        If BegDate > EndDate Then Err.Raise vbObjectError + 3
     
        dt = BegDate
        Work_Days = 0
        While dt <= EndDate
            If DatePart("w", dt, vbMonday) < 6 And IIf(bAvecJFerie, Not EstFerie(dt), True) Then
                Work_Days = Work_Days + 1
            End If
            dt = DateAdd("d", 1, dt)
        Wend
        Exit Function
     
    Work_Days_Error:
        Select Case Err.Number
            Case vbObjectError + 1: Work_Days = "Les 2 dates sont obligatoires."
            Case vbObjectError + 2: Work_Days = "Format de date incorrect."
            Case vbObjectError + 3: Work_Days = "La date de fin doit être postérieure à la date de début."
            Case Else: Work_Days = Err.Description
        End Select
    End Function
     
     
    Function EstFerie(ByVal QuelleDate As Date) As Boolean
    Dim anneeDate As Integer
    Dim joursFeries(1 To 11) As Date
    Dim i As Integer
      anneeDate = Year(QuelleDate)
     
      joursFeries(1) = DateSerial(anneeDate, 1, 1)
      joursFeries(2) = DateSerial(anneeDate, 5, 1)
      joursFeries(3) = DateSerial(anneeDate, 5, 8)
      joursFeries(4) = DateSerial(anneeDate, 7, 14)
      joursFeries(5) = DateSerial(anneeDate, 8, 15)
      joursFeries(6) = DateSerial(anneeDate, 11, 1)
      joursFeries(7) = DateSerial(anneeDate, 11, 11)
      joursFeries(8) = DateSerial(anneeDate, 12, 25)
     
      joursFeries(9) = fLundiPaques(anneeDate)
      joursFeries(10) = joursFeries(9) + 38 ' Ascension = lundi de Pâques + 38
      joursFeries(11) = joursFeries(9) + 49 ' Lundi Pentecôte = lundi de Pâques + 49
     
      For i = 1 To 11
        If QuelleDate = joursFeries(i) Then
          EstFerie = True
          Exit For
        End If
      Next
    End Function
     
    Private Function fLundiPaques(ByVal Iyear As Integer) As Date
            ' Adapté de plusieurs scripts...
            Dim L(6) As Long, Lj As Long, Lm As Long
     
            L(1) = Iyear Mod 19: L(2) = Iyear Mod 4: L(3) = Iyear Mod 7
            L(4) = (19 * L(1) + 24) Mod 30
            L(5) = ((2 * L(2)) + (4 * L(3)) + (6 * L(4)) + 5) Mod 7
            L(6) = 22 + L(4) + L(5)
     
            If L(6) > 31 Then
                    Lj = L(6) - 31
                    Lm = 4
            Else
                    Lj = L(6)
                    Lm = 3
            End If
     
            ' Lundi de Pâques = Paques + 1 jour
            fLundiPaques = DateAdd("d", 1, (Lj & "/" & Lm & "/" & Iyear))
     
    End Function

    apres cela le fonction workdays s'ajoute au fonction acces a utiliser comme vous le souhaiter . on esperant vous aider

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 770
    Points : 14 812
    Points
    14 812
    Par défaut
    Bonsoir,
    je me permet de corriger ton code qui ne formate pas les dates au format US, ce qui fait que des calculs sont faux :
    exemple :
    ?Work_Days(#22/12/2016#,#02/01/2017#,True) devrait renvoyer 8, or il renvoie 30 car la 2ème date, 02/01/2017, est interprétée comme étant 01/02/2017.

    Avec ce code il renvoie bien 8 :

    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
     
    Function Work_Days(BegDate As Variant, EndDate As Variant, _
                       Optional bAvecJFerie As Boolean = False) As Variant
        Dim dtb As Date
        Dim dte As Date
     
    On Error GoTo Work_Days_Error
        If IsNull(BegDate) Or IsNull(EndDate) Then Err.Raise vbObjectError + 1
        If Not IsDate(BegDate) Or Not IsDate(EndDate) Then Err.Raise vbObjectError + 2
        dtb = Format(BegDate, "mm/dd/yyyy")
        dte = Format(EndDate, "mm/dd/yyyy")
        If dtb > dte Then Err.Raise vbObjectError + 3
     
        Work_Days = 0
        While dtb <= dte
            If DatePart("w", dtb, vbMonday) < 6 And IIf(bAvecJFerie, Not EstFerie(dtb), True) Then
                Work_Days = Work_Days + 1
            End If
            dtb = DateAdd("d", 1, dtb)
        Wend
        Exit Function
     
    Work_Days_Error:
        Select Case Err.Number
            Case vbObjectError + 1: Work_Days = "Les 2 dates sont obligatoires."
            Case vbObjectError + 2: Work_Days = "Format de date incorrect."
            Case vbObjectError + 3: Work_Days = "La date de fin doit être postérieure à la date de début."
            Case Else: Work_Days = Err.DESCRIPTION
        End Select
    End Function
    je n'ai testé que ce cas d'école ...

Discussions similaires

  1. Condition VBA J-4 sans les week end
    Par Naoned005 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 12/06/2012, 20h47
  2. [XL-2003] calendrier sans week end
    Par zangaloni dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/04/2012, 07h45
  3. [XL-2007] comment faire pr mettre a mon code les jours de la semaine sans le week end
    Par alexandrek dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/02/2011, 22h53
  4. requete de date sans les week-end
    Par bolloche dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/05/2008, 23h26
  5. Intervalle Date Sans Compter Les Week Ends
    Par datamind dans le forum Oracle
    Réponses: 6
    Dernier message: 05/05/2006, 18h14

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