Excel VBA : Calculer un écart-type en fonction d'une date [Résolu]

falia - 18 avril 2017 à 10:17 - Dernière réponse : ccm81 8204 Messages postés lundi 18 octobre 2010Date d'inscription 12 décembre 2017 Dernière intervention
- 21 avril 2017 à 16:28
Bonjour,

J'aurais aimé calculer un écart-type des redements (plage returns) en fonction d'une date entre dateDeb et dateFin (d'une plage dates contenant toute les dates).
J'avais deux idées mais les deux me retournent #valeur. POurriez-vous m'aider svp? Je ne pense pas être loin de la solution...

Function Ectype(returns as Range, dates as Range, dateDeb as Date, dateFin as Date) as Variant
Dim i,j,k,l,n,comp1,comp2 as Integer
n=dates.Columns.Count
comp1=0
comp2=0

For i=1 To n
comp1=comp1+1
If dates(i) = dateDeb Then
Deb=dates.Cells.Value(i) 'recup la place de la date debut
End If

For j=1 To n
comp2=comp2+1
If dates(i) = dateFin Then
Fin=dates.Cells.Value(j) 'recup la place de la datefin
End If

Dim res() as Range
ReDim res(n)

For k=comp1 To comp2
res(i)=returns(i)
Next k

Ectype=Application.WorksheetFunction.StDev(res)

End Function

------------------------------------------------------------------------------------------------
Function Ectype2(returns as Range, dates as Range, dateDeb as Date, dateFin as Date) as Variant

Dim i,comp,n as Integer
Dim res() as Range
comp=0
ReDim res(0)

Deb=dates.Find(dateDeb,dates) 'trouve l'indice de date debut
Fin=dates.Find(dateFin,dates) 'trouve l'indice de date fin
comp=Deb
n=Fin-Deb 'pour avoir le nb donnees sur la periode voulue

For i=1 To n
Do While comp <= dateDeb
res(i)=returns(comp)
comp=comp+1
Loop
Next i

Ectype2=Application.WorksheetFunction.StDev(res)

End Function




Merci

Afficher la suite 

10 réponses

Répondre au sujet
ccm81 8204 Messages postés lundi 18 octobre 2010Date d'inscription 12 décembre 2017 Dernière intervention - Modifié par ccm81 le 19/04/2017 à 10:32
+1
Utile
3
Essaies ceci (dates en colonnes triées ou non)

Public Function Ect(returns As Range, dates As Range, dateDeb As Date, dateFin As Date) As Single
Dim k As Long, tv(), n As Long, nd As Long, dd As Date
nd = dates.Columns.Count
n = 0
For k = 1 To nd
  dd = dates.Cells(1, k).Value
  If dd >= dateDeb And dd <= dateFin Then
    n = n + 1
    ReDim Preserve tv(n)
    tv(n) = returns.Cells(1, k).Value
  End If
Next k
Ect = Application.WorksheetFunction.StDev(tv)
End Function

Cdlmnt
Cette réponse vous a-t-elle aidé ?  
falia57 6 Messages postés mardi 18 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 20 avril 2017 à 16:43
Merci beaucoup ca fonctionne très bien.

Juste, mes dates sont en colonnes (donc j'ai pris les lignes) j'ai donc juste changer cela:



Public Function Ect(returns As Range, dates As Range, dateDeb As Date, dateFin As Date) As Single
Dim k As Long, tv(), n As Long, nd As Long, dd As Date
nd = dates.Rows.Count
n = 0
For k = 1 To nd
dd = dates.Cells(k, 1).Value
If dd >= dateDeb And dd <= dateFin Then
n = n + 1
ReDim Preserve tv(n)
tv(n) = returns.Cells(k, 1).Value
End If
Next k
Ect = Application.WorksheetFunction.StDev(tv)
End Function


Merci beaucoup pour ton aide !!!!!
falia57 6 Messages postés mardi 18 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 21 avril 2017 à 09:36
Si je veux le faire pour une somme, ou autre fonction Excel, je n'ai qu'à changer Stdev par Sum par exemple ? car j'ai essyé et j'obtiens VALEUR. J'ai aussi essayé de recopier les elements du tableau dans une boucle qui somme :

For i = 0 To UBound(tableau) - 1
TOTAL = TOTAL + tableau(i)
Next i


Mais cela ne marche pas non plus...

J'ai aussi essayé avec index :

=INDEX(plade de resultats;MATCH(DateDeb&DateFin;plage dates&plage dates;0)) 


et cela ne marche pas non plus...

Merci
falia57 6 Messages postés mardi 18 avril 2017Date d'inscription 21 avril 2017 Dernière intervention > falia57 6 Messages postés mardi 18 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 21 avril 2017 à 09:46
AH je viens de réussir avec simplement

{=SOMME(SI(B:B>=A1;SI(B:B<=A2;C:C;0)))}

Merci
Commenter la réponse de ccm81
ccm81 8204 Messages postés lundi 18 octobre 2010Date d'inscription 12 décembre 2017 Dernière intervention - 20 avril 2017 à 17:41
+1
Utile
3
Si les dates sont triées (ordre croissant), pas besoin de macro mais une définition de plages dynamiques
http://www.cjoint.com/c/GDupNkKzWHs

Si c'est fini, peux tu mettre le sujet à résolu (en dessous du titre de ton premier message)

Cdlmnt
Cette réponse vous a-t-elle aidé ?  
falia57 6 Messages postés mardi 18 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 21 avril 2017 à 09:07
ah super ca marche aussi
falia57 6 Messages postés mardi 18 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 21 avril 2017 à 09:09
je n'arrive pas a mettre le sujet en résolu (je l'avais posté avant de me faire un compte sur commentcamarche)
ccm81 8204 Messages postés lundi 18 octobre 2010Date d'inscription 12 décembre 2017 Dernière intervention - 21 avril 2017 à 16:28
Je vais demander aux admins de le faire

Bonne fin de journée

Cdlmnt
Commenter la réponse de ccm81
ccm81 8204 Messages postés lundi 18 octobre 2010Date d'inscription 12 décembre 2017 Dernière intervention - 18 avril 2017 à 18:55
0
Utile
1
Bonjour

Une question : Tes dates sont elles triées ?

Cdlmnt
falia57 6 Messages postés mardi 18 avril 2017Date d'inscription 21 avril 2017 Dernière intervention - 20 avril 2017 à 16:42
Oui elles sont triées
Commenter la réponse de ccm81