Problème déclaration fonction

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

idriss42

XLDnaute Nouveau
Bonjour,

Je suis débutant en excel/vba mais je dois l'assimiler très rapidement.
Je souhaite simuler ce taux court:

Function CIR(k As Integer) As Double
Dim i As Integer
CIR = 0.05
For i = 1 To k
CIR = CIR + (0.06 - CIR) + 0.003 * CIR ^ 0.5 * LOI.NORMALE.INVERSE(ALEA(), 0, 1)
Next i
End Function

Excel me dit " erreur de compilation, sub ou fonction non défini"

Pouvez-vous m'éclaircir à ce sujet.

Bonne journée à vous et merci par avance.
 
Re : Problème déclaration fonction

Bonjour Idriss et bienvenu, bonjour le forum,

Il me semble que tu ne peux pas utiliser les fonctions directement dans le code il te faudrait passer par :
Application.WorksheetFunction.et le nom de la fonction en anglais.
Mais je t'avoue que je connais même pas cette fonction avec le nom en français... Ça donnerait :

Code:
CIR = CIR + (0.06 - CIR) + 0.003 * CIR ^ 0.5 * Application.WorksheetFunction.NOMANGLAIS(Application.WorksheetFunction(NOMANGLAIS(), 0, 1)

[Édition]
Après avoir fait marché l'enregistreur de macros essaie comme ça :
Code:
CIR = CIR + (0.06 - CIR) + 0.003 * CIR ^ 0.5 * Application.worksheetFunction.NORMINV(Application.WorksheetFunction.Rand(), 0, 1)
 
Dernière édition:
Re : Problème déclaration fonction

Bonjour.

Voyez si vous ne pouvez vous servir de ces fonctions :
VB:
Function AléatN(ByVal ÉTyp As Double, ParamArray Moy() As Variant) As Variant
Dim TRés() As Double, N As Long, Np As Long, AléN1 As Double: Static AléN2 As Double, DéjàDonné As Boolean
If UBound(Moy) <= 0 Then
   GoSub Donner: AléatN = AléN1 * ÉTyp
   If UBound(Moy) = 0 Then AléatN = Moy(0) + AléatN
Else
   ReDim TRés(1 To UBound(Moy) + 1) As Double
   Np = 0: N = 1: Do:
      GoSub Donner: TRés(N) = Moy(Np) + AléN1 * ÉTyp: If N = UBound(TRés) Then Exit Do
      Np = N: N = N + 1: Loop
   AléatN = TRés
   End If
Exit Function
Dim AléU1 As Double, AléU2 As Double, S As Double
Donner: If DéjàDonné Then
   AléN1 = AléN2: DéjàDonné = False
Else:                 AléU1 = Aléat * 2 - 1
   Do: AléU2 = AléU1: AléU1 = Aléat * 2 - 1: S = AléU1 * AléU1 + AléU2 * AléU2: Loop Until S <= 1
   S = Sqr(-2 * Log(S) / S): AléN1 = AléU1 * S: AléN2 = AléU2 * S: DéjàDonné = True: End If
Return
End Function
'

Function Aléat(Optional ByVal G As Double = -1) As Double
Static X As Double
If G >= 0 Then If G > 0 Then X = G Else X = Now / 2958466
X = (X + 1.35198775424545) ^ 7: X = X - Int(X)
Aléat = X
End Function
Aléat pourrait théoriquement être remplacé par Rnd. Mais j'ai écrit ma propre fonction suite au constat d'alignements fâcheux, nuisant à la crédibilité d'un ciel étoilé.
Le ParamArray correspond à un nombre quelconque de paramètres exprimant tous la moyenne souhaitée, réelle, complexe, spatiale, hyper-complexe etc.
 
Re : Problème déclaration fonction

Bonjour et bienvenue sur XLD

La fonction ALEA n'est pas une fonction VBA.

En VBA, voyez du côté:

  • de la fonction RND qui renvoie une valeur entre 0 et 1 ( 1 est exclus) et RANDOMIZE (pour initialiser le générateur de nombres aléatoires)
  • ou bien pour utiliser une fonction de feuille: Application.WorksheetFunction.RAND()

Edit : désolé, j'avions point réactualiser.
 
Dernière édition:
Re : Problème déclaration fonction

J'ai bien l'impression que ca avance, toutefois, excel me renvoie toujours valeur?

Function CIR(k As Integer) As Double
Dim i As Integer
CIR = 0.05
For i = 1 To k
CIR = CIR + (0.06 - CIR) + 0.03 * CIR ^ 0.5 *
Application.WorksheetFunction.NormInv(Application.WorksheetFunction.Rand(), 0, 1)
Next i
End Function


Voyez vous un autre souci ? Je suis totalement un aveugle débutant.

Merci à vous pour votre contribution!
 
Re : Problème déclaration fonction

Je précise que ma fonction AléatN est faite pour renvoyer ce qu j'ai cru discerner dans la loi normale inverse appliquée à une valeur aléatoire en distribution uniforme, à savoir donc un nombre aléatoire en distribution normale selon un certain écart type autour d'une moyenne imposée.
 
Dernière édition:
Re : Problème déclaration fonction

elle est tout de même compliquée
Oui enfin c'est surtout beaucoup d'intendance autour de ça essentiellement : S = Sqr(-2 * Log(S) / S)

Si vous préférez fournir deux Rnd (eh oui, il en faut 2) j'ai ça qui est peut être plus simple :
VB:
Function DistrN(ByVal Rnd1 As Double, ByVal Rnd2 As Double, ByVal ÉTyp As Double, ParamArray Moy() As Variant) As Variant
Const Pi = 245850922 / 78256779, Pi×2 = 2 * Pi 
Rnd1 = Sqr(-2 * Log(Rnd1)) * ÉTyp: Rnd2 = Rnd2 * Pi×2
If UBound(Moy) = 1 Then
DistrN = Array(Moy(0) + Rnd1 * Cos(Rnd2), Moy(1) + Rnd1 * Sin(Rnd2))
Else: DistrN = Moy(0) + Rnd1 * Cos(Rnd2): End If
End Function
Voyez si vous pouvez faire plus simple en étudiant ce lien à partir de la section III B
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
7
Affichages
702
Retour