Loi de poisson et #VALEUR!

oracle7

XLDnaute Nouveau
Bonsoir à tous,

Voilà mon problème :
J'ai développé un fonction personnelle qui utilise la loi de poisson pour faire un calcul de nombre de pièces de rechanges.
Ma fonction effectue des itérations successives jusqu'à ce que le calcul par loi de poisson respecte une condition donnée (passée en 4e paramètre).
Autant à la première itération le calcul s'effectue bien autant pour toutes les itérations suivantes je récupère le message d'erreur #VALEUR!.
Pouvez-vous SVP m'aider à comprendre quelle est mon erreur ? :confused:

Merci d'avance pour vos réponses.
Cordialement
oracle7556 :):):)

PS : Pour aider à comprendre ce qui ce passe voici une copie d'écran et le code VBA de ma fonction :



Code:
Public Function F_Calcul_NbRechanges(pi_NbMateriel As Integer, pi_Aor As Integer, _
                                     pd_lambda As Double, pd_Pnrs As Double) As Integer
'=======================================================================================
' Fonction      : F_Calcul_NbRechanges
' Objet         : Calculer le nombre de rechanges nécessaires pour maintenir un ensemble _
                  d'équipements tout en respectant une PNRS donnée.
' Crée le       : 05/05/2010 par JCR
' Description   : On utilise la loi de poisson pour déterminer par itérations successives _
                  le nombre de rechanges adéquats
' Arguments     : pi_NbMateriel IN = Nombre d'équipements pris en compte _
                  pi_Aor IN = Temps de fonctionnement opérationnel annuel des équipements _
                  pd_Lambda IN = Mid Time Between Failure de l'équipement _
                  pd_Pnrs IN = Probabilité de Non Rupture de Stock à respecter
' Valeur retour : Nombre de Rechanges calculé
'=======================================================================================
' Utilisation   : vi_NbRechanges = F_Calcul_NbRechanges(pi_NbMateriel,pi_Aor,pd_Lambda,pd_Pnrs)
'==============================Historique des modifications=============================
' Date          Indice      Auteur      Sujet
' 05/05/2010    A00         JCR         Création
'
'---------------------------------------------------------------------------------------
    ' Déclarations Publiques / Privées
'---------------------------------------------------------------------------------------
    Dim vb_Test As Boolean  ' Indicateur de sortie de boucle
    Dim vd_NbRechanges As Double    ' Nombre de rechanges calculé
    Dim vd_NbPannes As Double   ' Nombre de pannes attendues
    Dim vd_LoiPoisson As Double ' Résultat de l'application de la loi de poisson
'---------------------------------------------------------------------------------------
    ' Initialisations
'---------------------------------------------------------------------------------------
    vd_NbRechanges = 0
    vb_Test = False
'---------------------------------------------------------------------------------------
    ' Implémentation
'---------------------------------------------------------------------------------------
    ' On calcule de nombre de pannes attendues
    vd_NbPannes = pi_NbMateriel * pi_Aor * pd_lambda
    Do
        ' On applique la loi de poisson pour chaque évenement
        vd_LoiPoisson = WorksheetFunction.Poisson(vd_NbRechanges, vd_NbPannes, True)
        ' On vérifie que le calcul respecte la PNRS imposée
        If vd_LoiPoisson > pd_Pnrs Then
            ' OUI : Fin du calcul
            vb_Test = True
        Else
            ' NON : on passe à l'évenement suivant
            vd_NbRechanges = vd_NbRechanges + 1
        End If
    Loop Until vb_Test
    ' On renvoie le Nb de rechanges calculé
    F_Calcul_NbRechanges = CInt(vd_NbRechanges)
           
End Function
 

ROGER2327

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

Bonsoir oracle7
Rien à dire sur votre code qui devrait fonctionner et... ...ne fonctionne pas !

Toutefois, en remplaçant la ligne
Code:
[COLOR="DarkSlateGray"][B]    vd_NbPannes = pi_NbMateriel * pi_Aor * pd_lambda
[/B][/COLOR]
par
Code:
[COLOR="DarkSlateGray"][B]    vd_NbPannes = pi_NbMateriel * pd_lambda * pi_Aor
[/B][/COLOR]
tout rentre dans l'ordre !

Ne me demandez pas pourquoi : je l'ignore.​
ROGER2327
#3418


16 Floréal An CCXVIII
2010-W18-3T21:16:38Z
 

oracle7

XLDnaute Nouveau
Re : Loi de poisson et #VALEUR!

Bonjour ROGER2327

Encore un mystère de l'informatique !!!

Ceci étant, Milles MERCIs pour m'avoir débloquer la situation, je commençais à tourner en bourrique ...
Comme d'habitude tu es toujours aussi efficace :)
A++
Cordialement
oracle7 :):):)
 

ROGER2327

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

Re...
Bonjour ROGER2327

Encore un mystère de l'informatique !!!

(...)
Pour le coup, c'en est un !
Si quelqu'un a une explication, je suis preneur.

Pour résumer le problème : Dans le code du message #1, la ligne
Code:
[COLOR="DarkSlateGray"][B]vd_NbPannes = pi_NbMateriel * pi_Aor * pd_lambda
[/B][/COLOR]
provoque une erreur.

Le remplacement de cette ligne, sans aucune autre modification, par cette autre :
Code:
[COLOR="DarkSlateGray"][B]vd_NbPannes = pi_NbMateriel * pd_lambda * pi_Aor
[/B][/COLOR]
ne provoque pas d'erreur.

Question : Pourquoi ?
ROGER2327
#3424


17 Floréal An CCXVIII
2010-W18-4T11:04:03Z
 

Paritec

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

Bonjour Roger Oracle 7,
Et si vous laissez dans l' ordre de départ , mais que vous déclarez pi_AOR en double cela donne quoi?
C'est vrai que vu le problème et la solution , il n'y a pas grand chose à comprendre!!
a+
Papou :)
 

pierrejean

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

bonjour a tous

Une autre solution testée sous Excel 2000 : Modifier les Dim de pi_NbMateriel et pi_Aor

Code:
Public Function F_Calcul_NbRechanges(pi_NbMateriel As[COLOR=blue] Long[/COLOR], pi_Aor As[COLOR=blue] Long[/COLOR], _
                                     pd_lambda As Double, pd_Pnrs As Double) As Integer

Mon explication (sous toutes reserves )
Il semble qu'Excel n'admette pas que le produit de deux Integer soit autre chose qu'un Integer
Je regarderai plus tard ce qu'il se passe sous 2007

PS: En sus je trouve la une justification a ma vieille marotte qui consiste a omettre de declarer les variables : Otez toutes les declarations et cela fonctionne !!
 
Dernière édition:

CBernardT

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

Bonjour à tous,

Une explication plausible :

Lorsque la fonction réalise successivement les quatre multiplications, la multiplication des deux premiers nombres de type Integer "7056 * 5" donne 35280 valeur qui n'est plus de type Integer ( -32 768 à 32 767).

Si l'on change le type de données Integer de l'une des deux variables en Long, la fonction redevient opérationnelle. Le résultat intermédiaire prenant certainement le type de données le plus large.

En retard, je vois que Pierrejean que je salue est déjà passé par là !
 

job75

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

Bonjour oracle7, Roger, papou, pierrejean :)

J'ai cherché dans l'aide VBA, et pour addition ou multiplication on trouve :

Le type de données de l'argument result correspond généralement à celui de l'expression la plus précise. Les types de données sont classés dans l'ordre de précision croissant suivant : Byte, Integer, Long, Single, Currency, Double et Decimal. Le tableau ci-dessous décrit les exceptions à cette règle (...)

Bien sûr la macro de pierrejean bug aussi sous 2003.

A+
 

ROGER2327

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

Bonjour à tous
Je pense que CBernardT a raison et que pierrejean, job75 donnent l'explication. Merci Messieurs.
Finalement, voilà ce que je comprends :
Lorsqu'on écrit a = b * c, seul les types de b et c sont pris en compte lors du calcul, quel que soit le type attribué à a.

Si on déclare
Dim a As Double
Dim b As Integer
Dim c As Integer

a = b * c
le type de a n'est pas pris en compte avant le calcul, mais après.

VB calcule b * c et, détectant deux entiers courts, il évalue le produit comme devant être un entier court sans s'occuper du type de la variable à laquelle le résultat doit être affecté. En cas d'échec (produit attendu >32767) une erreur survient. En cas de réussite (produit <32768), le résultat est converti au type de a.
Il faudrait donc écrire a = CDbl(b) * CDbl(c), ou au minimum, compte tenu de la remarque de job75, a = CDbl(b) * c.

Ai-je bien compris ?​
ROGER2327
#3429


17 Floréal An CCXVIII
2010-W18-4T16:32:21Z
 

Paritec

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

Bonsoir Roger, Pierrejean, Cbernard, Job ,
Je suis content car je n'étais pas hors sujet dans ma réponse
sans donner la réelle solution comme Job ou PierreJean ou Cbernard
bonne soirée à tous
Papou :)
 

job75

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

RE,

Finalement, voilà ce que je comprends :
Lorsqu'on écrit a = b * c, seul les types de b et c sont pris en compte lors du calcul, quel que soit le type attribué à a.
(...)
Ai-je bien compris ?

Je pense qu'avant d'affecter le résultat à la variable a, VBA entre le résultat dans un espace (mémoire) tampon dont la dimension correspond au type le plus précis des variables b et c.

Il y a bug si cet espace est insuffisant.

A+
 

ROGER2327

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

Re...
Bonsoir Roger, Pierrejean, Cbernard, Job ,
Je suis content car je n'étais pas hors sujet dans ma réponse
sans donner la réelle solution comme Job ou PierreJean ou Cbernard
bonne soirée à tous
Papou :)
Effectivement, mon cher, et je suis confus de vous avoir oublié dans mon message. Bonne soirée tout de même, voisin.​
ROGER2327
#3430


17 Floréal An CCXVIII
2010-W18-4T17:35:32Z
 

Paritec

XLDnaute Barbatruc
Re : Loi de poisson et #VALEUR!

Re bonsoir Roger,
merci beaucoup toi aussi,
oui c'est vrai que nous sommes voisin
a+
Bonne soirée
Papou :)

EDIT Bonjour Job, non on lis tes posts n'ai pas peur !!! bonne soirée
 
Dernière édition:

Statistiques des forums

Discussions
312 463
Messages
2 088 626
Membres
103 894
dernier inscrit
tanyroc