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 :

Fonction pour calculer le nombre de jour par mois entre 2 dates


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Fonction pour calculer le nombre de jour par mois entre 2 dates
    Pour faire suite à mon post dans la rubrique Requetes & SQL:
    http://www.developpez.net/forums/sho...d.php?t=467827

    J'ai commencé une fonction dont voici le code :
    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
     
    Function EntreDeuxDates(Date1 As Variant, Date2 As Variant, Annee1 As Variant, Mois1 As Variant)
     If (Month(Date1) = Mois1 And Year(Date1) = Annee1) Or (Month(Date2) = Mois1 And Year(Date2) = Annee1) Or (Date1 < DateSerial(Annee1, Mois1, 1) And Date2 > DateSerial(Annee1, Mois1 + 1, 1) - 1) Then
     
       If Date1 < DateSerial(Annee1, Mois1, 1) Then
          If Date2 > (DateSerial(Annee1, Mois1 + 1, 1) - 1) Then
             EntreDeuxDates = (DateSerial(Annee1, Mois1 + 1, 1) - 1) - (DateSerial(Annee1, Mois1, 1)) + 1
          Else
             EntreDeuxDates = DateSerial(Year(Date2), Month(Date2), Day(Date2)) - (DateSerial(Annee1, Mois1, 1)) + 1
          End If
       Else
            If Date2 > DateSerial(Annee1, Mois1 + 1, 1) - 1 Then
              EntreDeuxDates = (DateSerial(Annee1, Mois1 + 1, 1) - 1) - Date1 + 1
            Else
              EntreDeuxDates = Date2 - Date1 + 1
            End If
       End If
     Else
     
     End If
    End Function
    n'étant pas très doué pour la programmation, mon code me donne pour le moment le résultat voulu.
    Reste plus qu'a le tester dans divers cas d'utilisation.

    Bien sur j'attend toutes les remarques et conseils de vos parts pour l'amélioration de celui-ci, merci.

  2. #2
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bonsoir,

    Ton code fonctionne peut être (je ne l'ai pas étudié en détail) mais
    • Par habitude (question d'optimisation), j'évite de refaire deux fois le même calcul. Ici tu recalcules plusieurs fois la même date avec DateSerial
    • Les variables et paramètres ne sont pas typés. L'usage du Variant peut se justifier ici si tu crains d'avoir des valeurs nulles (non supportées par le type Date)...



    Je ne suis pas sur que cela soit mieux ... mais pour ma part, j'aurai fait qq chose du genre (non testé)
    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
    Function EntreDeuxDates(Date1 As Variant, Date2 As Variant, Annee1 As Variant, Mois1 As Variant) As Integer
     
    Dim dDebM As Date
    Dim dFinM As Date
     
    Dim dDebP As Date
    Dim dFinP As Date
     
    Dim iNbJ  As Integer
     
     
        If IsDate(Date1) And IsDate(Date2) Then
            's'assurer que les dates sont dans le bon ordre
            If Date1 >= Date2 Then
                dDebP = Date2
                dFinP = Date1
            Else
                dDebP = Date1
                dFinP = Date2
            End If
     
            'mois étudié
            dDebM = DateSerial(Annee1, Mois1, 1)
            dFinM = DateSerial(Annee1, Mois1 + 1, 0)
     
     
            'déterminer la période commune
            If dDebP > dFinM Or dFinP < dDebM Then
                iNbJ = 0
            Else
                If dDebP <= dDebM Then
                    dDebP = dDebM
                End If
     
                If dFinP <= dFinM Then
                    dFinP = dFinM
                End If
     
                'calculer le nombre de jour
                iNbJ = dFinP - dDebP + 1
     
            End If
     
     
        Else
            'dates invalides ou nulles
            iNbJ = 0
        End If
     
        EntreDeuxDates = iNbJ
     
    End Function

  3. #3
    Membre expérimenté

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonsoir,

    http://access.developpez.com/faq/?page=dates#DateDiff
    Comment calculer la différence entre 2 dates
    Ne te convient pas?

    Cordialement.

  4. #4
    Membre expérimenté

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonsoir,

    J'ai répondu sans voir la réponse de mout1234. Evidement on ne joue plus dans la même cour....
    Le débat s'élève:
    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
    Option Compare Database
    Option Explicit
    Public Enum acInterval
        acIntervalText
        acIntervalNum
    End Enum
     
    Public Function Interval(Date_Début As Date _
        , Date_Fin As Date _
        , Optional Fmt As acInterval = acIntervalText) As String
        ' cette fonction permet de calculer le temps passé
        ' entre deux dates selon le format.
        On Error GoTo Err_Func
        Dim Années As Long, Mois As Long, Jours As Long, _
            Heures As Long, Minutes As Long, Secondes As Long
        Dim Date1 As Date
        Années = DateDiff("yyyy", Date_Début, Date_Fin)
        If DateSerial(Year(Date_Fin), Month(Date_Début), _
                      Day(Date_Début)) > Date_Fin Then
            Années = Années - 1
        End If
        Date1 = DateAdd("m", Années * 12, Date_Début)
        Mois = DateDiff("m", Date1, Date_Fin)
        If Day(Date_Fin) < Day(Date1) Then
            Mois = Mois - 1
        End If
        Date1 = DateAdd("m", Mois, Date1)
        Secondes = DateDiff("s", Date1, Date_Fin)
        Jours = Int(Secondes / 86400)
        Secondes = Secondes - (Jours * 86400)
        Heures = Int(Secondes / 3600)
        Secondes = Secondes - (Heures * 3600)
        Minutes = Int(Secondes / 60)
        Secondes = Secondes - (Minutes * 60)
        Interval = ""
        If Fmt = acIntervalText Then
            Interval = Interval & IIf(Années = 0, "", _
                       IIf(Années = 1, Années & " an ", Années & " ans "))
            Interval = Interval & IIf(Mois = 0, "", Mois & " mois ")
            Interval = Interval & IIf(Jours = 0, "", _
                       IIf(Jours = 1, Jours & " jour ", Jours & " jours "))
            Interval = Interval & IIf(Heures = 0, "", _
                       IIf(Heures = 1, Heures & " heure ", Heures & " heures "))
            Interval = Interval & IIf(Minutes = 0, "", _
                       IIf(Minutes = 1, Minutes & " Minute ", Minutes & " Minutes "))
            Interval = Interval & IIf(Secondes = 0, "", _
                       IIf(Secondes = 1, Secondes & " seconde ", Secondes & " secondes "))
        Else
            Interval = Interval & Format(Années, "00") & ":"
            Interval = Interval & Format(Mois, "00") & ":"
            Interval = Interval & Format(Jours, "00") & ":"
            Interval = Interval & Format(Heures, "00") & ":"
            Interval = Interval & Format(Minutes, "00") & ":"
            Interval = Interval & Format(Secondes, "00")
        End If
        Exit Function
    Err_Func:
        Interval = "#Erreur"
    End Function
            Appel de la fonction:
     
            <Variable String> = Interval(<Date début>, <date fin> [, acInterval])
    Pioché chez Stucki on trouve aussi :
    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
    Function TempsJoursHeuresMinutesSecondes(intervalle)
    ' L'argument intervalle est fourni par la soustraction de deux valeurs de date et heure
    ' Par exemple entre HeureFin et HeureDébut d'une table de relevé des temps (tblRelevéTemps)
    ' La fonction est appelée depuis une zone de texte d'un état (EtatRelevéTemps)
    Dim TotalHeures As Long, TotalMinutes As Long
    Dim TotalSecondes As Long
    Dim Jours As Long, Heures As Long, Minutes As Long
    Dim Secondes As Long
    Jours = Int(CSng(intervalle))
    TotalHeures = Int(CSng(intervalle * 24))
    TotalMinutes = Int(CSng(intervalle * 1440))
    TotalSecondes = Int(CSng(intervalle * 86400))
    Heures = TotalHeures Mod 24
    Minutes = TotalMinutes Mod 60
    Secondes = TotalSecondes Mod 60
    TempsJoursHeuresMinutesSecondes = Jours & " Jours " & Heures & " Heures " & Minutes & _
    " Minutes " & Secondes & " Secondes "
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Function JoursEcoulés(intervalle)
    ' Calcule le nombre de jours écoulés entre deux dates. Le résultat est affiché en jours.
    ' L'argument intervalle est fourni par la soustraction de deux dates.
    ' Par exemple dans la requête ReqDélaiEnvoi fondée sur la table des commandes
    ' pour déterminer le nombre de jours écoulés entre la date de commande et la date d'envoi.
    Dim Jours As Long
    Jours = Int(CSng(intervalle))
    JoursEcoulés = Jours & " Jours "
    End Function
    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
     
    Function TempsHeuresMinutes(intervalle As Variant) As String
    ' Retourne le temps écoulé en jours et en fraction de jours, formatté en heures:minutes
    ' Par exemple 2.1 jours = 5O:24
    ' Utile quand le résultat dépasse 24 heures
    Dim TotalHeures As Long, TotalMinutes As Long, TotalSecondes As Long
    Dim Jours As Long, Heures As Long, Minutes As Long, Secondes As Long
    Jours = Int(CSng(intervalle))
    TotalHeures = Int(CSng(intervalle * 24))
    TotalMinutes = Int(CSng(intervalle * 1440))
    TotalSecondes = Int(CSng(intervalle * 86400))
    Minutes = TotalMinutes Mod 60
    Secondes = TotalSecondes Mod 60
    If Secondes > 30 Then Minutes = Minutes + 1 'arrondi personnalisé
    TempsHeuresMinutes = TotalHeures & ":" & Format(Minutes, "00")
    End Function
    Tout ceci semble être une bonne base pour se faire un module personnalisé.

    Cordialement.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Je te remercie Francishop, je vais étudier tous les codes et liens que tu m'a fourni.


    Je te remercie aussi Mout1234 pour tes conseils et ton code que je vais testé dans la journée a preniere vu j'arrive a lire et comprendre ton code alors que j'ai du mal a lire le mien avec tous mes 'DateSerial'.
    Ton code est clair.

  6. #6
    Membre expert
    Avatar de FreeAccess
    Homme Profil pro
    Un monde ou prendre est plus facile qu'apprendre.
    Inscrit en
    Mars 2006
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Un monde ou prendre est plus facile qu'apprendre.

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 745
    Points : 3 834
    Points
    3 834
    Par défaut
    Bonjour,

    @ francishop et @ mout1234.........

    Je ne comprends pas très bien la réponse que vous apporter à Doo89.....dans la mesure ou cela ne correspond pas trop à son problème....
    Je sais faire les requetes pour compter les jours d'arrets entre deux dates.......je voudrai a partir d'une nouvelle requete compter le nombre de jours par agents et par mois suivant les dates d'arrets.
    Sa fonction fonctionne très bien et retourne correctement le nombre de jour d'arrêt pour chacun des Agents par mois...
    ...Nom.. | prenom | DateDebut. .| DateFin...| Janvier | Février |. . Mars .|. . Avril . |
    -------------------------------------------------------------------------------------
    DUPONT | Robert..| 05/01/2007 |08/02/2007|. .27 . .| . . 8 . . | . . 0 . . | . .0 . .
    DURAND | . Jean. .| 22/03/2007 |18/04/2007|. . 0 . .| . . 0 . . | . .10 . . | . 18 . .
    Maintenant, il ce peut que sa fonction mérite d'être optimiser.....mais en l'état actuel elle remplie parfaitement son rôle...

  7. #7
    Membre expérimenté

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 350
    Points : 1 701
    Points
    1 701
    Par défaut
    Bonsoir,
    Citation Envoyé par FreeAccess Voir le message
    @ francishop et @ mout1234.........

    Je ne comprends pas très bien la réponse que vous apporter à Doo89.....dans la mesure ou cela ne correspond pas trop à son problème....
    Il est vrai que je n'ai pas cherché à répondre directement à la demande. Il m'a semblé que cette dernière portait sur des conseils, voir un guidage. Ce que j'ai fais en précisant :
    Tout ceci semble être une bonne base pour se faire un module personnalisé.
    Cordialement.

Discussions similaires

  1. [VxiR2] Calcul du nombre de jours par mois entre deux date
    Par trabelsi dans le forum Designer
    Réponses: 4
    Dernier message: 02/10/2017, 15h17
  2. [XL-2003] Compter le nombre de jours par mois entre deux dates
    Par Mikayel dans le forum Excel
    Réponses: 8
    Dernier message: 23/09/2016, 13h36
  3. Calcul en nombre de jours l'écart entre deux dates
    Par theber dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 05/12/2014, 07h57
  4. Calcul du nombre de jours non ouvrés entre deux dates
    Par allweneed dans le forum Oracle
    Réponses: 6
    Dernier message: 27/04/2010, 17h34
  5. [AC-2007] Calcul du nombre de jours par mois entre deux dates
    Par arouxy dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/01/2010, 08h34

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