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

Macros et VBA Excel Discussion :

Dernier jour du Mois/Trimestre à partir d'une série.


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Asset Management
    Inscrit en
    Mars 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Asset Management
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2016
    Messages : 18
    Points : 7
    Points
    7
    Par défaut Dernier jour du Mois/Trimestre à partir d'une série.
    Bonjour à tous,

    Voici mon "problème":

    j'ai en colonne A des dates consécutives (du lundi au vendredi, mais sans les samedis et dimanches) sur les X dernières années.
    je cherche à récupérer les lignes correspondantes au dernier jour de chacun des mois (& présentes dans la liste, c'est à dire que si le 31 mars est un dimanche, cette date ne sera pas dans ma liste, il faudrait donc qu'il me renvoie la ligne du 29 mars qui est effectivement le dernier jour du mois)

    et même chose sur le dernier jour des trimestres (ça je pense que c'est facile une fois que je sais faire pour un mois, il me suffit de conditionner le mois: 3/6/9/12).

    Est-ce que vous avez une idée? c'est juste sur la condition, pour récupérer la data je sais faire.

    Merci bcp pour votre aide!

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Salut,

    tu peux tres bien fonctionner en partant du calcul du premier jour du mois suivant, avec par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim dt As Date
    dt = DateSerial(2016,4,1)
    Do 
    dt=dt-1
    Loop Until WeekDay(Dt, vbMonday)<6
    MsgBox "Le dernier jour ouvre du mois de mars 2016 est " & dt
    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 :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

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

    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
    Invité
    Invité(e)
    Par défaut
    bonjour,
    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
    Private Sub test()
    Debug.Print DernierJourDuMois(#1/1/2016#) ' cette date tombe un dimanche donc le dernier jour du mois est le 29/01/2016
    End Sub
    Function DernierJourDuMois(d As Date) As Date
    Dim Le28DuMois As Date, I As Integer
    Le28DuMois = CDate(Format(CDate(Format(d, "yyyy-mm-28")) + 5, "yyyy-mm-01")) - 1
    While Ferier(Le28DuMois - I) = True
    I = I + 1
    Wend
    DernierJourDuMois = Le28DuMois - I
    End Function
    Function Ferier(UneDate) As Boolean  ' Par défaut la fonction ne considère pas que les Dimanche de Pâques
    ' et de Pentecôte sont fériés
    ' il suffit de renseigner l'argument DimanchesOuiNon à True à l'appel de la fonction
    ' pour les considérer comme fériés
    If Weekday(UneDate) = 1 Or Weekday(UneDate) = 7 Then Ferier = True: Exit Function
     
    Dim JFF ' table des fériés fixes (jours)
    Dim MFF ' table des fériés fixes (mois)
    JFF = Array(1, 1, 8, 14, 15, 1, 11, 25)
    MFF = Array(1, 5, 5, 7, 8, 11, 11, 12)
    Dim J As Long
    Ferier = False
    ' Recherche dans la table des jours fériés fixes
    For J = 0 To 7
    If Day(UneDate) = JFF(J) And Month(UneDate) = MFF(J) Then
    Ferier = True
    Exit Function
    End If
    Next J
    Dim FM ' contient les dates des lundis de Paques
    'FM = Array(38824, 39181, 39531, 39916, 40273, 40658, 41008, _
    '41365, 41750, 42100, 42457, 42842, _
    '43192, 43577, 43934, 44291, 44675, _
    '45026, 45383, 45768, 46118, 46475, _
    '46860, 47210, 47595)
     
    FM = Paque(Year(UneDate))
    ' Recherche si la date est un lundi de paques
    ' ou jeudi de l'ascension
    ' ou lundi de pentecôte
    'For J = 0 To 24 ' à changer si vous allez au delà de 2030
    lpn = DateDiff("d", FM, UneDate)
    If lpn < 7 Then
        If Weekday(UneDate) = 2 Then Ferier = True: Exit Function
    End If
    If (UneDate = FM) Or (UneDate = FM + 39) Or (UneDate = FM + 50) Then
    Ferier = True
    Exit Function
    End If
    ' si DimanchesOuiNon est vrai
    ' on teste les dimanches de Pâques et Pentecote
     
     
    If DimanchesOuiNon Then
    If (UneDate = FM - 1) Or (UneDate = FM + 48) Then
    Ferier = True
    Exit Function
    End If
    End If
    'Next J
    End Function
    Function Paque(Annee As Integer) As Date
    Dim A, B, C, d, E, F, G, H, I, J, K, L, M, N, O
    C = Annee - 1900
    d = C Mod 19
    E = (d * 7) + 1
    F = Int(E / 19)
    G = 11 * d - F + 4
    H = G Mod 29
    I = Int(C / 4)
    J = C - H + I + 31
    L = J Mod 7
    K = J Mod 7
    L = 25 - H - K
    M = CDate("31/03/" & Annee)
    Paque = M + L
    End Function

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Bonsoir dysortho,

    Ta réponse me paraît juste, il y a seulement pour ta fonction Ferier (rédigée probablement sur un coin de table ) que je m'interroge :

    Que se passe-t-il si FM>UneDate ta variable lpn ne risque-t-elle pas d'être négative, et si UneDate est un lundi, il sera compté comme férié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lpn = DateDiff("d", FM, UneDate)
    If lpn < 7 Then
        If Weekday(UneDate) = 2 Then Ferier = True: Exit Function
    End If
    Maintenant je dis peut-être une grosse bêtise

    Bon week-end et merci pour tes contributions en général
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour,

    ou bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function dernierJO(dat1 As Date) As Date
        dernierJO = Application.WorkDay_Intl(DateSerial(Year(dat1), Month(dat1) + 1, 1), -1, 1)
    End Function
    possibilité d'ajouter l'argument optionnel [jours_fériés]
    eric

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    En fait il serait pas très honnête de dire que cette source est entièrement de moi!

    Dans la source d'origine,vue que les fêtes religieuses sont indexés sur pâque, il existait un tableau des pâques sur dix ans!

    Je me suis documenté pour voire si il n'était pas possible de trouver la date de pâques pour une année donné!

    J'ai trouvé sur Wikipédia une explication du genre petit a) faire ça;petit b) faire ci! Ce qui explique le codage de la fonction pâques!

    J'ai laissé en l'êta les commentaires de l'auteur, qui n'était pas forcément le concepteur d'origine. Si je le nomme pas c'est que celui ci n'a pas mis son nom dans les commentaires de sa source!

    J'ai qualifié cette source sur les 20 dernière année précédent ma première utilisation personnel! J'avoue ne pas avoir identifié la remarque de User mais dans le cadre de mes prestations de services (SSII) je n'ai rencontré aucun problème depuis quinze ans que je l'utilise dans mes reports d'activités mensuels!

    Pour la partie que j'ai modifié, je suis d'accord, c'était bien un coin de table! Et pour le reste sens doute!
    Dernière modification par Invité ; 03/02/2018 à 13h31.

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Merci pour ces explications, je comprends mieux maintenant son historique

    Cordialement,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

Discussions similaires

  1. exécution d'une macro si date du jour = dernier jour du mois en cours
    Par Tournament dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 18/06/2015, 17h45
  2. Réponses: 7
    Dernier message: 06/08/2013, 16h59
  3. Connaitre 1er et dernier jour du mois d'une date donnée
    Par kerido dans le forum Général Java
    Réponses: 4
    Dernier message: 14/05/2012, 14h18
  4. Réponses: 11
    Dernier message: 19/03/2009, 10h06
  5. Réponses: 3
    Dernier message: 19/04/2002, 00h11

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