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 :

Fonction ARC COSINUS


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Fonction ARC COSINUS
    Bonjour tout le monde,

    J'ai un petit soucis avec une fonction "arcos" qui a toujours fontionnée, et qui du jour au lendemain génère une erreur.

    J'utilise EXCEL 2003 SP2, et VBA 6.3

    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    '////////////////////////////////////////
    Public Function ARCOS(angle As Variant) As Double
        'Dim value As Double
        If (angle = 1) Then 'condition 1
            ARCOS = 0
        ElseIf (angle = -1) Then 'condition 2
            ARCOS = 4 * Atn(1) 'PI
        Else 'condition 3
            ARCOS = 2 * Atn(1) + Atn(-angle / Sqr(1 - angle * angle))
        End If
    End Function
    '////////////////////////////////////////
    Voici l'erreur: lorsque "angle = -1", la macro ne s'arrête pas à la condition 2, mais va jusqu'à la 3 !! Comme dit plus haut, ça a toujours fonctionné jusqu'à il y a 3 jours, bien sur sans rien changer au code, et sans modif matérielle (ah si maintenant que j'y pense quelques mises à jour de windows!!)

    En pièce jointe: une copie d'écran du code quand ça bloque.

    Merci
    Images attachées Images attachées  

  2. #2
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Salut,

    Si tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ElseIf angle = -1 Then 'condition 2
    'ou
    ElseIf angle = (-1) Then 'condition 2
    Ca plante aussi ?

  3. #3
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Aaaah !
    Voilà ce que j'appelle une question bien posée !
    Du code, un message d'erreur, des espions proposés dans la saisie d'écran, ... super !
    Il ne manquait que les balises autour du code, mais, j'ai corrigé ce petit oubli.


    Concernant ton souci, je me demande s'il vient de ta fonction, car ce message (appel de procédure incorrect) indique qu'il ne peut compiler du fait de l'usage incorrect, sur le plan syntaxique, d'un procédure.
    Essaie de nous indiquer quelle est la ligne en surbrillance (je ne la voie pas dans la saisie d'écran) car c'est à cet endroit que le bât blesse

    A+

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Je plussoie :

    Telle qu'elle est écrite, la fonction ne passe pas par la condition 3 si ANGLE = -1 !

    Le preuve :
    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
    MsgBox ARCOS(-1)
    
    
    Public Function ARCOS(angle As Variant) As Double
        'Dim value As Double
        If (angle = 1) Then 'condition 1
            MsgBox "je passe par la condition 1"
            ARCOS = 0
        ElseIf (angle = -1) Then 'condition 2
            MsgBox "je passe par la condition 2"
            ARCOS = 4 * Atn(1) 'PI
        Else 'condition 3
             MsgBox "je passe par la condition 3"
            ARCOS = 2 * Atn(1) + Atn(-angle / Sqr(1 - angle * angle))
        End If
    End Function
    Il est donc plus vraisemblable que la valeur passée n'est pas = -1 !!! (laquelle ?)
    Curieux typage de angle (celui que j'ai mis en rouge) ...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Il serait en effet plus judicieux de passer angle comme étant un paramètre de type "Double".

    Attention à Variant: son utilisation peut provoquer tout un tas de bogues. Ne l'utiliser que vraiment en dernier recours quand on n'a plus le choix.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour tout le monde, merci pour vos réponses et votre intérrêt!!

    Citation Envoyé par oOVaveOo Voir le message
    Salut,

    Si tu mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ElseIf angle = -1 Then 'condition 2
    'ou
    ElseIf angle = (-1) Then 'condition 2
    Ca plante aussi ?
    => oui!

    Citation Envoyé par Maxence HUBICHE
    Essaie de nous indiquer quelle est la ligne en surbrillance (je ne la voie pas dans la saisie d'écran) car c'est à cet endroit que le bât blesse
    => La ligne en surbrillance qd ça bloc est:
    " ARCOS = 2 * Atn(1) + Atn(-angle / Sqr(1 - angle * angle))"

    Citation Envoyé par ucfoutu
    Je plussoie : ()
    Telle qu'elle est écrite, la fonction ne passe pas par la condition 3 si ANGLE = -1 !
    [...]
    Il est donc plus vraisemblable que la valeur passée n'est pas = -1 !!! (laquelle ?)
    Curieux typage de angle (celui que j'ai mis en rouge) ...
    =>Certes; il est vraissemblable que la valeur passée n'est pas -1, mais autre chose; ce que n'indique pourtant pas mon espion (voir copie d'écran du 1er message). Je soupconnais un pb d'arrondi, j'ai donc essayé en vain divers type, le dernier étant variant!


    Citation Envoyé par decondelite
    Il serait en effet plus judicieux de passer angle comme étant un paramètre de type "Double".
    => Ne marche pas mieux!!

    Je n'y parais pas, mais je ris jaune là, parce qu'elle a toujousr marché cette fonction!!!

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ARCOS = 2 * Atn(1) + Atn(-angle / Sqr(1 - angle * angle))
    Si c'est là que ça plante, peut-être que tu ne dispose plus des fonctions Atn ou Sqr, voire les deux.

    Vérifie qu'elles soient bien présentes dans la librairie VBA->Maths.

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par xime78 Voir le message
    =>Certes; il est vraissemblable que la valeur passée n'est pas -1, mais autre chose; ce que n'indique pourtant pas mon espion (voir copie d'écran du 1er message). Je soupconnais un pb d'arrondi, j'ai donc essayé en vain divers type, le dernier étant variant!
    On "n'essaye pas" divers types, lorsque l'on développe !
    On les définit !
    Et (bien évidemment) : on vérifie (avant même d'appeler la fonction qui les utilise) qu'ils sont du type attendu (ne serait-ce que pour ne pas, dans ton exemple, envoyer une chaîne de caractères là où un numérique est attendu !!!).
    D'où récupères-tu donc la valeur de la variable angle que tu envoies à ta fonction? C'est là, qu'il te faut être attentif (après, ma foi, tu subis ...)!
    Et on vérifie également que la valeur passée est une valeur acceptable (il est par exemple évident que la valeur 2 provoquerait une erreur !)

  9. #9
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Si tu fais ça :
    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
    Sub test()
     
    MsgBox ARCOS(-1)
     
    End Sub
     
    '////////////////////////////////////////
    Function ARCOS(angle As Variant) As Double
        'Dim value As Double
        If (angle = 1) Then 'condition 1
            ARCOS = 0
        ElseIf (angle = -1) Then 'condition 2
            ARCOS = 4 * Atn(1) 'PI
        Else 'condition 3
            ARCOS = 2 * Atn(1) + Atn(-angle / Sqr(1 - angle * angle))
        End If
    End Function
    Ca plante aussi ?

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par oOVaveOo Voir le message
    Si tu fais ça :
    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
    Sub test()
     
    MsgBox ARCOS(-1)
     
    End Sub
     
    '////////////////////////////////////////
    Function ARCOS(angle As Variant) As Double
        'Dim value As Double
        If (angle = 1) Then 'condition 1
            ARCOS = 0
        ElseIf (angle = -1) Then 'condition 2
            ARCOS = 4 * Atn(1) 'PI
        Else 'condition 3
            ARCOS = 2 * Atn(1) + Atn(-angle / Sqr(1 - angle * angle))
        End If
    End Function
    Ca plante aussi ?
    Non ça ca marche!


    En ce qui concerne les différents types: avant d'aller voir sur un forum, et puisque ma fonction marchait très bien jusque là, j'ai cherché la solution au problème; d'où les "essai"!!


    Sqr et Atn sont bien présentes.

    A part ça, ça bloque plus précisément au calcul de la racine, puisqu'un espion judicieusement placé m'informe que '1 - angle * angle' vaut -4.44089209850063E-16... ('angle' est quant à lui toujours affiché à -1)...

  11. #11
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Octobre 2008
    Messages : 273
    Points : 323
    Points
    323
    Par défaut
    Citation Envoyé par xime78 Voir le message
    Non ça ca marche!
    Dis nous comment tu récupères la valeur de angle puisque ça ça marche.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    A mon avis, pour la valeur de angle, VBA t'affiche -1 pour l'espion, mais en réalité il doit probablement valoir -1,00000002 et des poussières, ce qui te donnerait le résultat de -4E-16, je ne vois pas d'autre explication.
    Et après, forcément la racine carré d'un nombre négatif, ça plante car VBA ne connaît pas les nombres complexes, ou alors il faut lui apprendre.

    Ceci expliquerait également que les 2 tests situés avant sont négatifs.

    Voilà, et j'en déduis que c'est toi qui a donné un mauvais paramètre.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Effectivement, je crois que decondelite a raison...

    A moi de trouver où ça coince, mais ça risque d'être long, car 'angle' vient d'un produit scalaire, pour lequel j'avais pourtant bien divisé par la norme... Je crois que certains types étaient mal définis, je dois me retrouver avec des "single" ou des "double", et du coup avoir des pb d'arrondis...

    Merci à tous!

  14. #14
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    essaye de mettre angle en Currency

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

Discussions similaires

  1. [Turbo Pascal] Fonction Cosinus avec les sommes partielles
    Par max0u13 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 13/02/2011, 22h54
  2. Fonction sinus et cosinus
    Par danathane dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 14/10/2008, 16h21
  3. Affiner une courbe à l'aide d'une fonction cosinus
    Par momo032114 dans le forum MATLAB
    Réponses: 0
    Dernier message: 12/08/2008, 16h42
  4. La fonction arc cos
    Par taty86 dans le forum Pascal
    Réponses: 8
    Dernier message: 03/05/2007, 19h00
  5. Arc cosinus
    Par SuperCed dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 17/02/2005, 17h58

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