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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 3
    Points : 1
    Points
    1
    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 914
    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 914
    Points : 5 121
    Points
    5 121
    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
    --------------------------------------------------------------*****----------------------------------------------------------------------------
    Bonne Continuation & Plein Succès
    Notre seul pouvoir véritable consiste à aider autrui avec modestie
    ______________________________________________________
    Pour dire merci, cliquer sur et quand la discussion est résolue, penser à cliquer sur le bouton

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    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).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  4. #4
    Membre chevronné
    Inscrit en
    Septembre 2007
    Messages
    1 132
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 132
    Points : 1 803
    Points
    1 803
    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
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    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
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    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.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Feuille de calcul
    Merci pour votre aide

    Voici le fichier. Les contrats sont sous le titre "Périodes de services civils "

    Contrats.xlsm

  8. #8
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour gentilgars
    Désolé, mais je n'ouvre (et n'ouvrirai) jamais un classeur tiers.
    Si tu veux montrer comment tu disposes tes données et résultats de calculs, tu peux par contre le faire en mettant ici une copie d'écran.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Voici la copie d'écran. Les contrats sont sous le titre "Périodes de services civils "
    Nom : Copie écran.jpg
Affichages : 737
Taille : 379,8 Ko

  10. #10
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 82
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bien. Vu.
    Mais cela ne me dit pas où et comment tu comptes faire apparaître les résultats dont tu parles dans ton 1er message.
    Pour mémoire (ce que tu as écrit) :
    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

    Fais (on y verra clair) une copie d'écran avec simulation (dates de contrats et répartition du nombre de trimestre par année) d'un contrat du 01/01/2000 au 29/02/2000 et un autre du 30/04/2011 au 31/03/2027
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

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