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 :

Macro complemenataire-erreur "#VALUE"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut Macro complemenataire-erreur "#VALUE"
    Bonjour a toute la communauté,

    Je rencontre depuis plusieurs un problème lorsque je veux exécuter une macro complémentaire dans Excel 2007.

    Voici le problème. Je souhaite calculer les coefficient de corrélation croisés (en anglais cross corrélation) de deux variable. J'ai écrit une fonction "Cross" qui doit normalement retourner un vecteur contenant les différents coefficients en fonction du retard. Seulement lorsque rentre dans un classeur et que je l'exécute elle me renvoie à chaque fois "#VALUE".
    J'ai enregitrer dans un fichier .xlam que j'ai add-in.

    Voici le code source
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    Option Explicit
    Option Base 0
     
    Function cross1(data As Range, lag As Integer)
     
        Dim n As Long, nseries As Long
        Dim t As Long, j As Long, i As Long, k As Long
        Dim x() As Double, y() As Double
        Dim somxy() As Double, somx() As Double, somx2() As Double, somy() As Double, somy2() As Double
        Dim crosout() As Double
     
        nseries = data.Columns.Count
        n = data.Rows.Count
     
        ReDim somxy(lag + 1)
        ReDim somx(lag + 1)
        ReDim somx2(lag + 1)
        ReDim somy(lag + 1)
        ReDim somy2(lag + 1)
        ReDim crosout(lag + 1)
     
        For i = 0 To lag Step 1
            somxy(i) = 0
            somx(i) = 0
            somx2(i) = 0
            somy(i) = 0
            somy2(i) = 0
        Next i
     
        ReDim x(n)
        ReDim y(n)
     
        For i = 0 To n - 1 Step 1
                x(i) = data(i, 1)
                y(i) = data(i, 2)
        Next i
     
        For t = 0 To n - 1 Step 1
            j = 0
            While ((t - j >= 0) And j <= lag)
                somxy(j) = somxy(j) + x(t) * y(t - j)
                somx(j) = somx(j) + x(t)
                somx2(j) = somx2(j) + x(t) * x(t)
                somy(j) = somy(j) + y(t - j)
                somy2(j) = somy2(j) + y(t - j) * y(t - j)
                j = j + 1
            Wend
        Next t
        ReDim crosout(lag + 1)
     
        For j = 0 To lag Step 1
            crosout(j) = ((n - j) * somxy(j) - somx(j) * somy(j)) / Sqr((n * somx2(0) - somx(0) * somx(0)) * ((n - j) * somy2(j) - somy(j) * somy(j)))
        Next j
     
        cross1 = crosout
     
        End Function

  2. #2
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2009
    Messages
    1 794
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 86
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 1 794
    Par défaut Pas à Pas
    Bonjour,

    Avez-vous essayé d'exécuter la fonction en mode Pas à Pas avec F8 et en mettant un Stop au début du code pour essayer de voir ou se produit l'erreur.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut Reponse
    Dans la fentre visual basic editor de Excel, le code compile sans erreur.
    Mais lorsque j'essaie d'utiliser la fonction dans une feuille excel elle me renvoie l'erreur #Value.
    Je voudrais que dans un classeur il soit possible d'appeler cette fonction juste en tapant dans une cellule.

  4. #4
    Membre Expert
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2009
    Messages
    1 794
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 86
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 1 794
    Par défaut Rebelote
    Bonjour,
    Je n'avais pas de doute sur le fait que la compilation se passait sans accros, sinon le message d'erreur aurait été différent.
    Ceci dit, avez-vous essayé de faire un débogage avec le pas à pas F8.
    Mettez donc un Stop juste après les déclarations de vos variables puis tapez votre fonction dans une cellule
    L'exécution du programme va s'arrêter au Stop à ce moment là vous pourrez suivre pas à pas (à chaque appui sur F8) l'exécution des instructions de la fonction, et vous pourrez ainsi découvrir a quel moment la/les variables ne sont pas ne sont pas corrrectement calculées. Il suffit pour voir le contenu d'une variable de mettre le pointeur de la souris sur le nom et le contenu apparaît dans une bulle, ou alors utilisez la fenêtre espion, c'est encore mieux car là on peut contrôler la valeur des variables au fur et à mesure de l'exécution pas à pas. Vous deviez peut-être lire un peu ce qu'il faut faire pour déboguer un programme qui ne donne pas le résultat escompté.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 3
    Par défaut Merciiiiiiiiiiiiiiiiiiii
    J'ai essayé l'exécution pas à pas. Elle m'a permis de détecter la source du problème. L'erreur provenait d'une mauvaise gestion de l'adressage des tableaux.
    Je me disais qu'en déclarant Base 0, les premiers éléments des tableaux porteraient l'indice O. Ce qui n'a pas été le cas, car lorsque je mettais somx(0) le programme ne reconnaissait pas l'élément.

    J'ai été obligé de translater tous les éléments d'une unité ce qui fait que le premier élément devient somx(1). Avec cela j'ai obtenu ce que je voulais.

    Merci une fois de plus pour votre aide.

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