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 :

Intégrer une fonction 360 jours dans access


Sujet :

VBA Access

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Juin 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Intégrer une fonction 360 jours dans access
    Bonjour à tous,
    Voila je suis un parfait novice sur access et après lecture d'un bon nombre de post, je ne trouve pas la solution à mon problème.
    Voila comme le titre l'indique je cherche une fonction d'access me permettant d'ajouter à une date d'un champ nommé "date d'avancement", un nombre de mois puis de déduire à la date trouver un nombre de jours, de mois et d'année( ces 3 variables ont chacune un champs distinct. Jusqu'ici tout va bien, pour déduire les 3 dernières variables, j'ai saisi leur valeur en négatif dans les champs correspondant. Cependant, mon problème est que le résultat doit intégrer que chaque mois est un mois de 30 jours.

    Dans une requête j'ai donc utilisé la fonction suivante : exp1 : AjDate("m";[table]![durée en mois];[Agents]![Date d'avancement ]). Dans un autre champ de ma requete : exp 2 : AjDate("m";[Agents]![Reliquat d'ancienneté en mois];[exp 1]). Encore dans un autre champ de ma requete : exp 3 : AjDate("aaaa";[Agents]![Reliquat d'ancienneté en année];[Expr2]). La meme chose pour mes jours.
    Le résultat est approximatif puisque il n'intègre pas qu'une année doit être de 360 jours.

    Merci d'avance pour votre aide.

    PS : j'ai lu ce post : http://www.developpez.net/forums/d59...tion-jours360/ mais je ne comprend pas comment faire fonctionner le VBA.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Bonjour

    Il est certain que Access travaille avec de "vraies" annees et pas des annees comptables.

    La 1ere solution consiste a tricher et a appeler une fonction de Excel.

    Pour faire cela il faut creer un module.
    Aller dans le meun outils / reference et d'ajoute Excel a la liste des refrences (Attention si tu prevois de deployer sur des postes dont les versions d'office sont differentes cela va poser des problemes car Access risque de ne pas trouver Excel).
    Apres tu peux entrer le code du post dans ton module.

    La seconde solution consiste a programmer toi-meme tes fonctions.

    Je pense que cela devrait ressembler a cette fonction a mettre dans un module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function CalculerNbJour(prmNbAnnee as long, prmNbMois as long, prmNbJour as long) as long
       dim result as long:result=0
       result=result+prmNbJour
       result=result+(30 * prmNbMois)
       result=result+(360 * prmNbAnnee)
       CalculerNbJour=result
    end function
    ex d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private sub Test_CalculerNbJour
       debug.print CalculerNbJour(1,1,1) '=1+30+360 = 391 jours comptables
    end sub
    Si tu veux calculer un date comptable en fonction du nombre de jours tu peux commencer comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    dim nbJour as long
    dim Jour as long
    dim Mois as long
    dim Annee as long
     
    Annee=NbJour\360 '\ est la division entiere si cela ne donne pas les resultats voulus utilise / et int().
    Mois=(NbJour-(Annee * 360))\30
    Jour=(NbJour-(Annee * 360)-(Mois * 30)
    Evidement cela peut te donner des combinaisons invalides comme le 30 Fevrier 2014 ou le 29 fevrier 2013. Il faudra que tu decides comment tu geres cela.

    Est-ce que le 30 fevrier devient le 1 ou le 2 mars selon que l'annee est bissextile ou pas ?
    Est-ce que le 30 fervier devient le 28 fevrier ?

    A+

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Rédacteur technique
    Inscrit en
    Juin 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Rédacteur technique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    En te remerciant pour ta réponse rapide. Cependant, il y a une chose que je ne suis pas sur de comprendre, pour utiliser un code : j'ouvre un formulaire je créer une étiquette et sur click par exemple je rentre la 2rd formule que tu m'as donnée ou bien je dois entrer le code depuis une requête?

    Concernant ta question, tu as raison j'ai oublié de le préciser mais bien entendu, il serait souhaitable que le mois de février devienne un mois de 28 jours.

    Merci pour tes lumières.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 371
    Points : 23 845
    Points
    23 845
    Par défaut
    Non tu as interet a mettre la fonction dans un module.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function CalculerNbJour(prmNbAnnee as long, prmNbMois as long, prmNbJour as long) as long
       dim result as long:result=0
       result=result+prmNbJour
       result=result+(30 * prmNbMois)
       result=result+(360 * prmNbAnnee)
       CalculerNbJour=result
    end function
    Apres tu peux l'appeler d'ou tu veux : champ d'un formulaire, champ d'un rapport ou bien d'une requete.

    Les requetes servent a afficher ou lire les donnees ou bien a agir sur elles (ex : Requete de Mise a jour). Elles sont ecrites en SQL un langage different de VBA (celui dans lequel j'ai ecrit la fonction).

    Pour "inverser" ton calcul tu pourrais faire :

    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
    public function CalculerAnneeMoisJour(prmNbJour as long) as date
      dim result as date
     
      dim Jour as long
      dim Mois as long
      dim Annee as long
     
      Annee=NbJour\360 '\ est la division entiere si cela ne donne pas les resultats voulus utilise / et int().
      Mois=(NbJour-(Annee * 360))\30
      Jour=(NbJour-(Annee * 360)-(Mois * 30) 
     
      if isdate(annee & "-" & mois & "-" & jour) then
            'C'est une date valide
            result=dateserial(annee, mois, jour)
         else
     
            if mois=2 then
                   'C'est probalement un 29 ou 30 fevrier
                   result=dateserial(annee, 2, 28) 'Ne gere pas les annees bisextile
               else
                   'Au cas ou il y aurait une faille dans ma logique, je veux etre alete d'un cas qui ne devrait jamais se produire.
                   error 5
            end if   
     
      end if
     
    end function
    Mettons que tu veuille ajouter 90j a la date d'aujourd'hui : 2014-06-23

    Tu pouurais faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private sub Test()
       dim nbJourDebut as long: nbJourDebut=CalculerNbJour(2014, 06, 23)
       dim nbJourFin as long:nbJourFin=nbJourDebut+90
       dim dateFin as date:dateFin=CalcuerAnneeMoisJour(nbJourFin)
       debug.print dateFin
       debug.print year(dateFin), month(dateFin), day(dateFin) 'Separe la date en ses 3 composantes.
    end sub
    En passant dans Access on utilise plutot des champs texte pour afficher les valeurs, les etiquettes servent generalement au texte fixe.
    En jouant sur les proprietes d'affichage on peut faire ne sorte qu'un champ texte ressemble a une etiquette si besoin est.

    A+

Discussions similaires

  1. Intégrer une fonction EQUIV dans une fonction INDIRECT
    Par Dgardian dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/12/2010, 16h33
  2. Intégrer une fonction dans iReport
    Par Alucard95 dans le forum Jasper
    Réponses: 66
    Dernier message: 23/01/2009, 17h12
  3. Intégrer une fonction VBA dans une requête
    Par chelmi95 dans le forum IHM
    Réponses: 1
    Dernier message: 15/09/2008, 19h55
  4. intégrer une fonction dans une requête
    Par badboys206s16 dans le forum ASP
    Réponses: 16
    Dernier message: 10/07/2006, 15h02
  5. Requete SQL permettent une mise a jour dans la base
    Par themagaly dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/06/2004, 10h32

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