VBA_calcul de délai moyen
Bonjour le forum,
Je vous écris car j'ai crée une fonction afin de calculer un délai de livraison moyen annuelle et mensuelle, or le résultat annuel qu'elle retourne n'est pas juste (approchant à 0.4) et pour le calcul mensuelle elle ne fonctionne pas du tout.
Voici ma fonction et le fichier et en PJ :
Function ttdelai(j)
Dim DD, DF, DateD, DateF As Variant
Dim i As Integer
Worksheets("test").Activate
derlig = Worksheets("test").Range("A" & Rows.Count).End(xlUp).Row
j = ActiveCell.Value
resultat = 0
cpt = 0
For i = 2 To derlig
DD = Cells(i, 2).Value
DF = Cells(i, 3).Value
DateD = Format(DD, "dd/mm/yyyy")
DateF = Format(DF, "dd/mm/yyyy")
If Year(j) = Year(DD) And Month(j) = Month(DD) Then
diff = DF - DD
resultat = resultat + diff
cpt = cpt + 1
End If
Next
ttdelai = (resultat / cpt)
End Function
Je ne serais pas contre un coup de main
Merci et au plaisir de vous lire !!!
bonjour
lorsque l'on crée une fonction en vba il faut essayer de s'approcher le plus possible des fonctions natives d'excel, ainsi, on ne rentre pas en dure dans le code les colonnes à visiter, mais on le demande à l'utilisateur.
dans ce que je te retourne, on ne traite que la comparaison mensuelle, à toi de nous dire
en pièce jointe ton fichier
Function ttdelai(plage1 As Range, plage2 As Range, datecompare)
Dim i As Integer
Dim diff As Double
Dim cpt As Integer
For i = 1 To plage1.Rows.Count
If Year(datecompare) = Year(plage1(i)) And Month(datecompare) = Month(plage2(i)) Then
diff = diff + (plage2(i) - plage1(i))
cpt = cpt + 1
End If
Next i
ttdelai = (diff / cpt)
End Functiona plus
Merci Hervé, c'est parfait !
Effectivement, ça parait plus logique !
Maintenant je me suis rendu compte que le résultat était biaisé quand le délai était nul (diff=0).
Faut-il que j'intègre cette contrainte dans mon code ou via une formule excel, un =SI() notamment ?
Pour le code :
Function ttdelai (plage1 As Range, plage2 As Range, datecompare)
Dim i As Integer
Dim diff As Double
Dim cpt As Integer
For i = 1 To plage1.Rows.Count
If (plage2(i) - plage1(i)) = 0 Then
Exit For
Else
If Year(datecompare) = Year(plage1(i)) And Month(datecompare) = Month(plage2(i)) Then
diff = diff + (plage2(i) - plage1(i))
cpt = cpt + 1
End If
End If
Next i
ttdelai = (diff / cpt)
End Function
Qu'en pensez vous ?
Au plaisir de vous lire
re
personnellement je ne suis pas adepte pour réinventer la roue, si tu solutionnes ton problème avec un simple =si(, ça me parait bien
a plus