Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/12/2011, 02h16   #1
Invité régulier
 
Inscription : mai 2011
Messages : 35
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 35
Points : 8
Points : 8
Par défaut Userform simple: Pas de résultats

Bonjour à tous!

Je suis en train de m'entrainer sur les userforms et mon code ne veut absolument pas marcher. Apres plusieurs messages d'erreur, il ne veut toujours pas me mettre un bon résultat. En ce moment il me met "Argument non facultatif" pour ma fonction pricer...

J'aurai besoin d'un oeil frais sur ce petit code


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
 
Function maturité()
 
    datetexte = CStr(jour.Value) & "/" & mois.Value & "/" & CStr(contenu_année.Value)
    maturité = (CDate(datetexte) - Date) / 365
 
End Function
 
 
 
Function pricers(s, k, r, sigma, t As Double) As Double
 
Dim d1 As Double
Dim d2 As Double
 
 
d1 = (Log(s / k) + (r + 0.5 * sigma ^ 2) * t) / (sigma * Sqr(t))
d2 = d1 - sigma * Sqr(t)
 
pricers = (s * WorksheetFunction.NormDist(d1) - k * Exp(-r * t) * WorksheetFunction.NormDist(d2))
 
End Function
 
Private Sub Pricer1_Click()
 
s = Val(cours.Value)
k = Val(strike.Value)
r = Val(rf.Value)
sigma = Val(volat.Value)
prix1.Value = Round(pricers(s, k, r, sigma, maturité()), 4)
 
 
End Sub

A savoir que les cours.value , strike.value ... correspondent à la valeur indiqué dans les userforms par l'utilisateur.

Merci!
cott333 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 02h26   #2
Membre habitué
 
Inscription : mai 2007
Messages : 106
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : mai 2007
Messages : 106
Points : 128
Points : 128
Salut le forum

Code :
NORMDIST(x, mu, sigma, cumul)
Les arguments de NORMDIST x, mu et sigma sont des valeurs numériques alors que l'argument cumul est une valeur logique de type TRUE ou FALSE. Sigma doit être supérieur à 0, mais aucune condition similaire n'est requise pour les arguments x et mu.

Référence : http://support.microsoft.com/kb/827371/fr

Mytå_Qc
Mytå_Qc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 13h13   #3
Invité régulier
 
Inscription : mai 2011
Messages : 35
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 35
Points : 8
Points : 8
Désolé jai pas compris où était mon erreur...

Pourriez vous me donner plus de précision? Merci!

D'accord!
J'ai en fait remplacer normdist par normsdist et ma fonction marche.
Mais pas le code...j'ai toujours un message d'erreur...

D'accord!
J'ai en fait remplacer normdist par normsdist et ma fonction marche.
Mais pas le code...j'ai toujours un message d'erreur qui est dépassement de capacité.
Je pense que ça a rapport avec la définition de d1 et d2 que j'ai défini en tant que double.
cott333 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2011, 21h24   #4
Membre habitué
 
Inscription : mai 2007
Messages : 106
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : mai 2007
Messages : 106
Points : 128
Points : 128
Re le forum
Citation:
Envoyé par cott333 Voir le message
A savoir que les cours.value , strike.value ... correspondent à la valeur indiqué dans les userforms par l'utilisateur.
Les valeurs retournées par l'Userform sont des valeurs texte.
Regarde du côté de la conversion des valeurs.

CDbl Convertit une expression au format chaîne de caractères ou numérique en valeur de type Double.

Mytå_Qc
Mytå_Qc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 10h14   #5
Expert Confirmé Sénior
 
Avatar de Qwazerty
 
Homme Stéphane
La très haute tension :D
Inscription : avril 2002
Messages : 2 446
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 32
Localisation : France

Informations professionnelles :
Activité : La très haute tension :D
Secteur : Service public

Informations forums :
Inscription : avril 2002
Messages : 2 446
Points : 4 620
Points : 4 620
Envoyer un message via MSN à Qwazerty
Salut

J'ai modifié ton code et l'ai commenté

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
'Evite les accents dans les nom de variable ou de nom de procédure/fonction
'Précise de quel type est ta fonction (As Double ici je suppose)
Function Maturite() As Double
 
'Il est préférable de déclarer tes variables
'Place toujours au moins une majuscule dans chaque variable pour les repérer plus facilement
 
'Dim DateTexte As String
Dim DateMature As Date
 
    'DateTexte = CStr(jour.Value) & "/" & mois.Value & "/" & CStr(contenu_année.Value)
    DateMature = DateSerial(contenu_année.Value, mois.Value, jour.Value)
 
    'Maturite = (CDate(DateTexte) - Date) / 365
    'Si ton besoin est de connaitre le nombre d'année dans une periode
    Maturite = DateDiff("d", DateMature, Date)
End Function
 
 
'Attention lors de la dclaration de plusieur variable, il faut préciser le type pour chaque variable
'Sinon VBA déclare les variables non typés comme étant de type variant
Function Pricers(s As Double, k As Double, r As Double, Sigma As Double, t As Double) As Double
 
Dim d1 As Double
Dim d2 As Double
 
 
d1 = (Log(s / k) + (r + 0.5 * Sigma ^ 2) * t) / (Sigma * Sqr(t))
d2 = d1 - Sigma * Sqr(t)
 
Pricers = (s * WorksheetFunction.NormDist(d1) - k * Exp(-r * t) * WorksheetFunction.NormDist(d2))
 
End Function
 
Private Sub Pricer1_Click()
'Soit tu déclares tes variables, soit tu utilises directement les valeurs dans l'appelle de la fonction
'Sans variables ça donne ça
'Comme dit dans un message précédent regarde du coté de Cdbl dans l'aide, il existe plusieurs autres fonction
'qui permettent de faire du transtypage
's = Val(cours.Value)
'k = Val(Strike.Value)
'r = Val(rf.Value)
'Sigma = Val(volat.Value)
prix1.Value = Round(Pricers(CDbl(cours.Value), CDbl(Strike.Value), CDbl(rf.Value), CDbl(volat.Value), Maturite()), 4)
 
End Sub

Par contre je serais toi, je modifierais Maturite en plaçant 2 paramètres Date, comme ça celui-ci est utilisable pour d'autre cas qu'avec une saisi dans les textbox de ta UserForm.
Si tu n'as jamais a faire ce calcul autre que dans ce cas de figure, passe plutôt les 2 dates en paramètre à ta fonction Pricers et calcul la maturité directement dans la fonction Pricers (et tu supprimes la fonction Maturite).

En règle générale, on crée une fonction uniquement si on a besoin de faire appelle plusieurs fois à une partie de code, on évite ainsi de répéter la même chose 50 fois.

++
Qwaz
__________________

MagicQwaz := Harry Potter la baguette en moins
Le monde dans lequel on vit
HammerFest
Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer
Qwazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h57.


 
 
 
 
Partenaires

Hébergement Web