IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Aide pour la création d'une fonction - moyenne mobile exponentielle


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Aide pour la création d'une fonction - moyenne mobile exponentielle
    Bonjour,

    Je débute en programmation VBA et dans le cadre d'une étude empirique, j'aurai besoin de réaliser des moyennes mobiles exponentielles sur des séries de cotations d'indices marchés.

    J'ai pu récupérer une fraction de code pour le calcul de cette "MME".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Explicit
    Private Sub Form_Load()
    'Exemple d'application pratique
    Dim Cours(6), Njours
    Cours(1) = 1525
    Cours(2) = 1460
    Cours(3) = 1256
    Cours(4) = 1246
    Cours(5) = 1196
    Cours(6) = 1254
    Njours = 6
    Debug.Print Moyenne_Mobile_Exponentielle(Cours(), Njours)
    End
    End Sub
    Public Function Moyenne_Mobile_Exponentielle(TDD(), Njours)
    Dim Alpha As Double, Beta As Double, I As Long, VMME As Double, NDC As Long
    Dim FormatChiffre As String
     
    'Vérifie le nombre de chiffre dans le nombre
     
    NDC = 1
     
    For I = 1 To Njours
    If Len(Str(TDD(I))) > NDC Then
    FormatChiffre = String(Len(Str(TDD(I))), "#")
    NDC = Len(Str(TDD(I)))
    End If
    Next
     
    Alpha = CDbl(Format(2 / Njours, "#.##"))
    Beta = CDbl(Format(1 - Alpha, "#.##"))
    VMME = CDbl(Format((TDD(1) * Beta) + (TDD(2) * Alpha), FormatChiffre))
     
    For I = 3 To Njours
    'Debug VMME
    VMME = CDbl(Format(VMME * Beta + (TDD(I) * Alpha), FormatChiffre))
    'Debug VMME
    Next
     
    Moyenne_Mobile_Exponentielle = VMME
    End Function

    Il me manque cependant des éléments pour finaliser cette fonction.

    1) j'aimerai pouvoir sélectionner une plage de données (exemple de D4 à D24)
    ----> Il faudrait donc déclarer une plage de cellule variable à la place de Cours(1), Cours(2) ...

    2)qu'il me calcule le nombre de jours de cotation sélectionné (par rapport à la plage sélectionnée) et qu'il m'en fasse la moyenne mobile exponentielle.
    ----> un moyen de faire sous vba nb(plage de cellules sélectionnée)



    Ce qui donnerait sous excel : =Moyenne_mobile_exponentielle(D1 : D20) par exemple

    La formule que j'ai présenté plus haut reprend cette logique. Néanmoins, les valeurs de cours sont en dur, or, je souhaiterais que cette série de cours soit une plage de cellule variable sous excel.

    Merci d'avance

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour,

    En reprenant ton code, voici une fonction personnalisée que tu peux utiliser directement dans ta feuille avec =Moyenne_mobile_exponentielle(D1 : D20) par exemple.
    Code à placer dans un module standard :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Option Base 1
    Option Explicit
    Public Function Moyenne_Mobile_Exponentielle(Plage As Range) As Long
    Dim Alpha As Double, Beta As Double, I As Long, VMME As Double, NDC As Long
    Dim FormatChiffre As String
    Dim TDD
    Dim Njours As Long
        TDD = Plage.Value
        Njours = UBound(TDD)
        'Vérifie le nombre de chiffre dans le nombre
        NDC = 1
        For I = 1 To Njours
            If Len(Str(TDD(I, 1))) > NDC Then
                FormatChiffre = String(Len(Str(TDD(I, 1))), "#")
                NDC = Len(Str(TDD(I, 1)))
            End If
        Next
        Alpha = CDbl(Format(2 / Njours, "#.##"))
        Beta = CDbl(Format(1 - Alpha, "#.##"))
        VMME = CDbl(Format((TDD(1, 1) * Beta) + (TDD(2, 1) * Alpha), FormatChiffre))
        For I = 3 To Njours
            VMME = CDbl(Format(VMME * Beta + (TDD(I, 1) * Alpha), FormatChiffre))
        Next
        Moyenne_Mobile_Exponentielle = VMME
    End Function
    Cordialement.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    super ça fonctionne super bien !

    Néanmoins, le résultat est arrondi en unité. Or, idéalement, il faudrait une moyenne qui aille jusqu'à 0,00001

    merci d'avance encore

    j'imagine que le problème réside dans les fonctions format dont je n'ai pas la connaissance ...

  4. #4
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Essaie avec ces 2 modifications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function Moyenne_Mobile_Exponentielle(Plage As Range) As Double
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FormatChiffre = "#.#####"
    Cordialement.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci de m'avoir répondu. Ca ne fonctionne pas...

    j'ai essayé en enlevant toutes les fonctions de format est c'est bon !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Option Base 1
    Option Explicit
    Public Function Moyenne_Mobile_Exponentielle(Plage As Range) As Double
    Dim Alpha As Double, Beta As Double, I As Long, VMME As Double
     
    Dim TDD
    Dim Njours As Long
        TDD = Plage.Value
        Njours = UBound(TDD)
     
        Alpha = (2 / Njours)
        Beta = (1 - Alpha)
        VMME = ((TDD(1, 1) * Beta) + (TDD(2, 1) * Alpha))
        For I = 3 To Njours
            VMME = (VMME * Beta + (TDD(I, 1) * Alpha))
        Next
        Moyenne_Mobile_Exponentielle = VMME
    End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide pour la création d'une vue
    Par bossun dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/07/2008, 09h19
  2. besoin d'aide pour la création d'une requête
    Par fabien59420 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 11/06/2008, 15h29
  3. Réponses: 3
    Dernier message: 26/06/2007, 14h53
  4. Problème pour la création d'une fonction
    Par jipé95 dans le forum C
    Réponses: 5
    Dernier message: 10/12/2006, 14h28
  5. Réponses: 2
    Dernier message: 10/03/2006, 13h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo