Fonctions récursives

FoLKeN

XLDnaute Junior
Hello forum !

Je voulais savoir s'il était possible de faire de la récursivité dans une fonction personalisée (en vba) ? J'ai essayé, il ne me met pas d'erreur de compil mais malheureusement je n'ai pas le résultat escompté.

Voici le code, si jamais vous voyez une erreur
Code:
Function CalcDate(FirstDate As Range, ByVal PreviousCell As Range, DaysOff As Range) As Variant

    Dim res As Variant
    
    If IsDate(FirstDate) = True Then
    
        If Weekday(PreviousCell, vbMonday) = 5 Then
            res = PreviousCell + 3
        Else
            res = PreviousCell + 1
        End If

        For Each cell In DaysOff
            If cell = res Then
                res = CalcDate(FirstDate, res, DaysOff)
            End If
        Next cell
        
        CalcDate = res
        
    Else
    CalcDate = "Enter the first date"
    End If
    
End Function

C'est une fonction qui doit afficher une date en fonction de la précédente (incrémentalement) et le faire sur une série de colonnes à la suite. Sachant que les weekend doivent être sautés, ainsi que les jours fériés (donnés dans le Range DaysOff). La récursivité sert à revérifier si ce n'est pas un weekend qui arrive, lorsque la date calculée est un jour férié (en comptant aussi qu'il peut y avoir des jours de repos qui se suivent). Le firstdate est juste la toute première date rentrée, toutes les autres sont calculées ensuite en fonction de celle-ci.

Désolé encore pour mon faible niveau en prog vba :)
Merci !
 
C

Compte Supprimé 979

Guest
Re : Fonctions récursives

Salut FoLKeN,

Si ta fonction est correcte, il suffit de mettre :
Code:
Function CalcDate(FirstDate As Range, ByVal PreviousCell As Range, DaysOff As Range) As Variant
[B][COLOR=royalblue]Application.Volatile[/COLOR][/B]
    Dim res As Variant
...

A voir ;)
 

FoLKeN

XLDnaute Junior
Re : Fonctions récursives

Ben en fait c'est là tout le principe de la récursivité, c'est que la fonction s'appelle elle-même. Ca optimise le calcul et simplifie la fonction. Je n'ai pas envie d'imbriquer 40 If & For !

Sinon le volatile ne fonctionne pas :( Je vais revérifier la fonction, mais elle me semble correcte.
 
C

Compte Supprimé 979

Guest
Re : Fonctions récursives

Re Folken,

La solution est là
Code:
Function CalcDate(FirstDate [COLOR=blue][B]As Date[/B][/COLOR], ByVal PreviousCell [B][COLOR=blue]As Date[/COLOR][/B], DaysOff As Range) [COLOR=blue][B]As Date[/B][/COLOR]
[COLOR=blue][B]Application.Volatile[/B][/COLOR]
Dim [B][COLOR=blue]Cell As Variant[/COLOR][/B], Res As Date
If IsDate(FirstDate) = True Then
  If Weekday(PreviousCell, vbMonday) = 5 Then
    Res = PreviousCell + 3
  Else
    Res = PreviousCell + 1
  End If
  For Each Cell In DaysOff
    If Cell = Res Then
        Res = CalcDate(FirstDate, [COLOR=blue][B]Cell[/B][/COLOR], DaysOff)
    End If
  Next Cell
  CalcDate = Res
  Else
  CalcDate = "Enter the first date"
End If
End Function

Voilà, j'ai testé chez moi ça fonctionne :D
 

Pièces jointes

  • Folken_FonctionCalcDate.xls
    25 KB · Affichages: 73

FoLKeN

XLDnaute Junior
Re : Fonctions récursives

T'es un dingue :) Ca marche super. Merci !

J'ai du modifié un ou deux trucs étant donné que le retour n'est plus un variant mais une date (donc le IF du firstdate ne sert plus à rien), mais je l'ai inséré directement en formule.

Biyoo
 

Discussions similaires

Réponses
1
Affichages
168

Statistiques des forums

Discussions
312 240
Messages
2 086 518
Membres
103 241
dernier inscrit
Peyo33