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 :

Programme VBA pour trouver le nombre de trimestres entre 2 dates


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 3
    Par défaut Programme VBA pour trouver le nombre de trimestres entre 2 dates
    Bonjour,

    J'ai une feuille Excel avec des dates de début et de fin de contrats.
    J'aimerais faire un programme en VBA qui renvoie pour chaque contrat le nombre de trimestres complets pour chaque année du contrat. Un trimestre commence le 1er Janvier, le 1er Avril, le 1er Juillet ou le 1er Octobre
    Par exemple si un contrat va du 01/08/1981 au 31/01/1983, je veux que le programme m'affiche :
    1981 : 1
    1982 : 4
    1983 : 0

    Je suis novice en VBA, et je bloque un peu au niveau de l'algorithme à cause des années bissextiles.

    Merci de votre aide.

  2. #2
    Expert confirmé Avatar de BENNASR
    Homme Profil pro
    Responsable comptable & financier
    Inscrit en
    Décembre 2013
    Messages
    2 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Responsable comptable & financier
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2 974
    Par défaut
    bonsoir
    Sans VBA : un tableau contenant une ligne pour chaque année (pour chaque contrat)
    En colonne A : le début de l'année sauf le cas du début du contrat 01/01/19nn
    En colonne B : la fin de l'année sauf le cas du fin du contrat 31/12/19nn
    et en C :
    ARRONDI.INF((B2-A2)/90;0)
    bonne continuation

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Il s'agit là de durées calendaires et non de durées temporelles et donc --->>
    Le nombre de trimestres complets entre deux dates s'obtient par exemple ainsi :
    1) aller à la date de début d'un trimestre ( 1er janv ou 1er avril, etc ...) la plus proche au delà de la première date
    2) calculer le nombre de mois entiers séparant la première date ainsi "reportée" et la seconde date
    3) calculer la partie entière de la division par 3 du résultat obtenu en 2)
    Commence sur ces bases.

    Je vais (comme d'habitude en ce qui me concerne) te mettre "sur la voie" du raisonnement exposé dans mon message précédent --->>
    regarde ce que fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     Dim date1 As Date
      date1 = Range("A1").Value
      Select Case Month(date1)
        Case Is <= 4
          date1 = IIf(Day(date1) = 1, DateSerial(Year(date1), 4, 1), DateSerial(Year(date1), 7, 1))
        Case Is <= 7
          date1 = IIf(Day(date1) = 1, DateSerial(Year(date1), 7, 1), DateSerial(Year(date1), 10, 1))
        Case Is <= 10
          date1 = IIf(Day(date1) = 1, DateSerial(Year(date1), 10, 1), DateSerial(Year(date1) + 1, 1, 1))
        Case Is <= 13
          date1 = DateSerial(Year(date1) + 1, 1, 1)
        End Select
      MsgBox "la date de début du 1er trimestre à considérer est le " & date1
    ce code te permet de trouver la date du 1er jour du 1er trimestre logique (celui égal ou qui commence juste après la date).
    Tu vois le genre de raisonnement ? --->> continue (je te regarde).

  4. #4
    Membre Expert
    Inscrit en
    Septembre 2007
    Messages
    1 142
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 142
    Par défaut
    Bonsoir unparia,
    Citation Envoyé par unparia Voir le message
    ce code te permet de trouver la date du 1er jour du 1er trimestre logique (celui égal ou qui commence juste après la date).
    J'ai quelques doutes car le prochain trimestre pour aujourd'hui commencerait le 1/7/2017 ?

    Bien cordialement

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour anasecu

    Ouille ! Tu as raison. Je me suis mélangé les pinceaux avec les chiffres.
    Mais on va de toutes manières faire plus simple, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub CommandButton1_Click()
      MsgBox deter_debut_trim(Range("A1").Value, 1)
    End Sub
    Private Function deter_debut_trim(D As Date, sens As Integer) As Date
     Y = Year(D)
      refs = Array(DateSerial(Y, 1, 1), DateSerial(Y, 4, 1), DateSerial(Y, 7, 1), DateSerial(Y, 10, 1), DateSerial(Y + 1, 1, 1))
      For i = 0 To UBound(refs)
        If D <= refs(i) Then
          deter_debut_trim = refs(i)
          Exit For
        End If
      Next
    End Function
    Tu auras repéré le paramètre sens.
    Je ne l'utilise pas encore, mais je suis certain que tu as déjà deviné à quoi il allait servir. Je préfère pour l'instant qu'on laisse gentilgars analyser et tenter de compléter seul

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bon
    On va finalement aller un peu plus loin car :
    1) ce n'est peut-être pas trop évident
    2) il lui restera quand même du travail à faire (calcul du nombre de trimestres complets et décomposition par années)

    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
    Private Sub CommandButton2_Click()
      MsgBox deter_borne_trim(Range("A1").Value, 1) & _
      vbCrLf & deter_borne_trim(Range("A2").Value, -1)
    End Sub
    Private Function deter_borne_trim(D As Date, sens As Integer) As Date
     Y = Year(D)
     Select Case sens
      Case 1
        refs = Array(DateSerial(Y, 1, 1), DateSerial(Y, 4, 1), DateSerial(Y, 7, 1), DateSerial(Y, 10, 1), DateSerial(Y + 1, 1, 1))
        For i = 0 To UBound(refs)
          If D <= refs(i) Then
            deter_borne_trim = refs(i)
            Exit For
          End If
        Next
      Case -1
        refs = Array(DateSerial(Y, 12, 31), DateSerial(Y, 9, 30), DateSerial(Y, 6, 30), DateSerial(Y, 3, 31), DateSerial(Y - 1, 12, 31))
        For i = 0 To UBound(refs)
          If D >= refs(i) Then
            deter_borne_trim = refs(i)
            Exit For
          End If
        Next
      End Select
    End Function
    EDIT : une chose attise ma curiosité personnelle, bien que n'ayant pas de rapport direct avec le code du mécanisme à mettre en oeuvre.
    C'est ce passage dans le tout premier message :
    J'aimerais faire un programme en VBA qui renvoie pour chaque contrat le nombre de trimestres complets pour chaque année du contrat
    j'aimerais voir la disposition prévue de ces données sur la feuille considérée, avec par exemple ces deux contrats : l'un du 01/01/2000 au 29/02/2000 et l'autre du 30/04/2011 au 31/03/2027
    Ce n'est pas le calcul, qui me parait compliqué, mais vraiment cette seule organisation de l'affichage des résultats calculés.

Discussions similaires

  1. [Vxi3] Trouver le nombre de jour entre 2 dates en invite
    Par samy37 dans le forum Designer
    Réponses: 3
    Dernier message: 17/08/2011, 13h34
  2. [AC-2003] Code VBA pour trouver la valeur max
    Par jokair dans le forum VBA Access
    Réponses: 5
    Dernier message: 25/08/2010, 09h47
  3. Conseil pour trouver le nombre d'enfant dans un treeview
    Par skunkies dans le forum Windows Forms
    Réponses: 0
    Dernier message: 27/01/2009, 10h50
  4. Meilleur livre de programmation VBA pour la finance
    Par Eric06 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/10/2008, 14h35
  5. [VBA-E] Help création d'un programme vba pour excel
    Par yampi dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/01/2007, 11h46

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