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 :

Fonction récursive qui ne fonctionne pas


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 19
    Points
    19
    Par défaut Fonction récursive qui ne fonctionne pas
    Bonjour,

    Mon problème est le suivant : j'effectue des calculs de dates en enchainant les calculs les uns aux autres.

    Disons, que par ligne cela représente
    • en regard d'un délai et d'une charge : une date de début, une date de fin
    • une date de début en reprévision et une date de fin en reprévision

    Par feuille une trentaine de lignes et 11 feuilles en tout.

    La première feuille donne la semaine de départ, ce qui permet le calcul des dates de départ des autres feuilles qui sont liées....(notion de tâches qui s'enchainent en quelque sorte)

    Bref, cela ressemble à une gestion de planning prenant en compte, les jours fériés, les heures ouvrées rien d'original ni extraordinaire, sauf que !

    La fonction qui me permet de calculer la date de fin fonctionne bien de manière unitaire et se met à déconner lorsqu'elle est appelée de manière récursive....

    Après y avoir passé plusieurs heures et tenter diverses méthodes je me décide à appeler à l’aide

    Voir fichier en PJ pour plus de compréhension (saisir la semaine de départ sur l'onglet tache_1 en F3)

    une copie de la fonction

    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
    Function TargetDate(Charges As Double, Delais As Double, DateDeb As Date) As Date
     
    'Reinit au cas ou les valeurs n'aient pas été chargées
    If Int(HMDeb) = 0 Then HMDeb = (DatePart("h", Range("HDeb")) / 24) + ((DatePart("n", Range("HDeb")) / 24) / 60)
    If Int(HMFin) = 0 Then HMFin = (DatePart("h", Range("HFin")) / 24) + ((DatePart("n", Range("HFin")) / 24) / 60)
     
    'Convertir Heures et Minutes de DateDeb
    HMSDate = Round((DatePart("h", DateDeb) / 24) + ((DatePart("n", DateDeb) / 24) / 60), 9)
     
    If Int(Delais) <> 0 Then   'Test pour prendre Charges ou Délais en
        TimeSrce = Delais       'TimeSource
    Else
        TimeSrce = Charges
    End If
     
    ' Ajouter les jours ....
    If Int(TimeSrce) > 0 Then
        Debug.Print Application.Caller.Address, DateDeb, Int(TimeSrce)
        DateEnd = CDate(Application.Run("ATPVBAEN.XLA!WorkDay", DateDeb, Int(TimeSrce), HoliDays()))
    Else
        DateEnd = DateValue(DateDeb)    'cas des feuilles vides
    End If
     
    ' Ajouter les heures....
    If Round((TimeSrce - Int(TimeSrce)), 4) <> 0 Then
        HTimeSrce = Round((Round((TimeSrce - Int(TimeSrce)), 4) * 8) / 24, 9)
        'Debug.Print "HTimeSrce : "; HTimeSrce
        EndHour = HMSDate + HTimeSrce
     
        If EndHour > HMFin Then    'Jour + 1 si Heure >= HFin
            HSUpp = EndHour - HMFin
            Debug.Print DateEnd, "HMFin="; HMFin; " HSupp="; HSUpp
            DateEnd = CDate(Application.Run("ATPVBAEN.XLA!WorkDay", DateEnd, 1, HoliDays()))
            DateEnd = DateAdd("h", DatePart("h", Range("HDeb")) + DatePart("h", HSUpp), DateEnd)
            DateEnd = DateAdd("n", DatePart("n", Range("HDeb")) + DatePart("n", HSUpp), DateEnd)
        Else
            'Debug.Print "EndHour < HMFin"
            DateEnd = DateAdd("h", DatePart("h", EndHour), DateEnd)
            DateEnd = DateAdd("n", DatePart("n", EndHour), DateEnd)
        End If
    Else
        DateEnd = DateAdd("h", DatePart("h", HMSDate), DateEnd) ' Sinon, reprendre les heures....
        DateEnd = DateAdd("n", DatePart("n", HMSDate), DateEnd) ' de la date orignale ;-))
    End If
     
    Debug.Print "TargetDate ==>"; ActiveSheet.Name, Application.Caller.Address, CDate(DateDeb), CDate(DateEnd)
    TargetDate = DateEnd
     
    End Function
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    La fonction qui me permet de calculer la date de fin fonctionne bien de manière unitaire et se met à déconner lorsqu'elle est appelée de manière récursive....
    ?? Je ne comprend pas ce que tu veux dire, un appel récursif c'est quand la fonction se réappelle elle-même or dans ta fonction il n'y a pas de rappel ??
    Il est aussi impossible de faire tourner la fonction vu que le classeur xla qui contient une macro n'est pas présent.
    A+

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    Tu as raison c'est un abus de langage

    En fait dans le classeur, si tu regardes bien les colonnes H et K, sur chaque ligne il y a un appel de la fonction TargetDate

    Et les lignes sont interdépendantes des unes des autres depuis la ligne considérée comme date de départ de référence à savoir la cellule E4 de l'onglet tache_1.

    Le calcul s'enchaine correctement sur la première feuille/premier onglet : tache_1, mais cela ne fonctionne pas/ou plus lorsque l'on s'éloigne de tache_1

    C'est d'autant plus flagrant lors de la relecture des feuilles en vba (onglet total.charges) / cliquer sur le bouton en A2

    Est-ce plus clair ?

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Impossible de tester sans le xla, les cellules qui doivent s'incréméntés d'un jour font appel à ce classeur, de ce fait toutes les formules sont en erreur.
    Tu pourrais pas mettre la macro WorkDay dans un poste suivant ?

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour,

    déjà : pourquoi ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If Int(HMDeb) = 0 Then HMDeb = (DatePart("h", Range("HDeb")) / 24) + ((DatePart("n", Range("HDeb")) / 24) / 60)
    If Int(HMFin) = 0 Then HMFin = (DatePart("h", Range("HFin")) / 24) + ((DatePart("n", Range("HFin")) / 24) / 60)
    alors que l'on ne voit pas ce que sont HMDeb et HMFin et comment et où elles ont été déclarées et initialisées ?
    Important, car : si non initialisées ailleurs, elles seront toujours = 0 à ce moment là ...
    Ce qui est écrit là n'a pour moi de sens que s'il s'agit de variables statiques et pour éviter (si peu) de les réinitialiuer si déjà fait !
    Question subsidiaire : as-tu utilisé Option Explicit ?

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    Concernant le workday...

    C'est le nom anglais de la fonction serie.jour.ouvrés qui se trouve dans les macros complémentaires "utilitaire d'analyse" soit la macro complémentaire ATPBVAEN.XLA. Comme travaille sur des postes ayant le MUI Office, et parfois non, j'ai pris l'option de la coder avec son son anglais (ça fait chic hein ! :-))

    Concernant la déclaration des variables HFIN, HDEB.
    Comme l'ensemble des variables elles sont dans l'onglet parameters qui possède un bouton permettant de supprimer et recréer l'ensemble des variables. Comme vous le verrez sans doute il y en a pas mal, car l'exemple que je vous envoie est une version expurgée de la version originale ==> limitation du download oblige.

    Ce sont donc des variables statiques. Le parti pris ne pas les mettre en "dur" dans le code vient du fait que cela fait partie des éléments modifiables (variabilisé) via des classeurs/feuilles de configurations externes : jours ouvrés, heure début, fin, heure déjeuner, etc... La mise à jour de l'onglet Parameters n'est pas fournie ici, toujours pour des raisons de ...taille du fichier.

    Non pas d'utilisation de l'option explicite.

    Quoiqu'il en soit, le bug demeure dans la version allégée. c'est à dire que cela fonctionne de manière unitaire, mais pas via des appels en cascade

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    Tu pourrais pas mettre la macro WorkDay dans un poste suivant ?
    Voilà c'est fait
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. fonction confirm() qui ne fonctionne pas sur IE7
    Par JackBeauregard dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/06/2008, 09h47
  2. Fonction mysql qui ne fonctionne pas pour un ancien postgreIste
    Par floreasy dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 15/01/2008, 18h49
  3. Fonction récursive qui ne renvoie pas le résultat
    Par mathieugamin dans le forum Langage
    Réponses: 4
    Dernier message: 05/11/2007, 10h29
  4. [SQL] Fonction SUM qui ne fonctionne pas !
    Par nigg4z dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 11/10/2007, 16h20
  5. Fonction While {} qui ne fonctionne pas
    Par zoom61 dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2006, 12h17

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