Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Fonction appelée de manière récursive

3 réponses
Avatar
Sadar
Bonjour,

Mon problème le suivant : j'ai une fonction qui effectue un calcul de date
de fin (workday) qui fonctionnen très bien de manière nominal mais qui,
appelée de manière récursive, se met à ne plus fonctionner.

Et très honêtement, je ne vois pas ce qui cloche

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

3 réponses

Avatar
FS
Bonjour,

Je ne comprends pas trop ce que cherche à faire ta fonction mais je ne
vois pas à quel moment (dans le code) elle serait récursive (elle ne
s'appelle pas elle-même).
Je suppose que ce qui cloche apparaît quand tu l'appelles dans une boucle ?
Ce que tu cherches à faire ayant l'air très spécifique, un petit exemple
sur c ou ci joint pourrait sans doute aider à t'aider.

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

Sadar a écrit :
Bonjour,

Mon problème le suivant : j'ai une fonction qui effectue un calcul de date
de fin (workday) qui fonctionnen très bien de manière nominal mais qui,
appelée de manière récursive, se met à ne plus fonctionner.

Et très honêtement, je ne vois pas ce qui cloche

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


Avatar
Sadar
Cette fonction est appelée n-fois par lignes et par onglets. Sur l onglet de
référence : tache_1, on saisi une semaine de début (F3) et tous les calculs
s'enchainent.

Cela fonctionne plutôt bien pour le premier onglet et plus on s'éloigne,
plus cela se met à déconner...

L'onglet Total.Charge qui possède un bouton en A2, déclenche un vba qui va
lire l'ensemble des onglets et là, va savoir pourquoi, tout se met en erreur

le lien est http://www.cijoint.fr/cjlink.php?file=cj200909/cijdjcXRI4.xls

Merci de vos éclairages
Avatar
FS
Bonsoir,

C'est en effet, à mon avis, ta procédure MAJ qui pose problème. Comme
j'ai du mal à comprendre ce qu'elle fait, les noms que tu utilises
n'étant pas très parlants pour moi, je ne peux guère t'aider à la modifier.
Par contre, il n'y a pas vraiment de problème pour moi dans tes
feuilles. Tous les calculs semblent se faire correctement (une fois
qu'on a coché l'utilitaire d'analyse). La procédure MAJ perturbe les
calculs dans les différents onglets mais un recalcul général (par
Ctrl+Alt+F9) rétablit les résultats attendus et supprime les valeurs
d'erreur.

FS
--
Frédéric SIGONNEAU
Modules et modèles pour Excel :
http://frederic.sigonneau.free.fr/

Sadar a écrit :
Cette fonction est appelée n-fois par lignes et par onglets. Sur l onglet de
référence : tache_1, on saisi une semaine de début (F3) et tous les calculs
s'enchainent.

Cela fonctionne plutôt bien pour le premier onglet et plus on s'éloigne,
plus cela se met à déconner...

L'onglet Total.Charge qui possède un bouton en A2, déclenche un vba qui va
lire l'ensemble des onglets et là, va savoir pourquoi, tout se met en erreur

le lien est http://www.cijoint.fr/cjlink.php?file=cj200909/cijdjcXRI4.xls

Merci de vos éclairages