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 :

une variable non définie?


Sujet :

Macros et VBA Excel

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut une variable non définie?
    Bonsoir , dans cette fonction que j'ai écrite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function toutou(ByVal n As Long) As Long
     
    If n >= 0 Then
        toutou = toutou((n*(n + 1) * (2 * n + 1)) / 6)
    Else
       toutou = n
     
    End Function
    A la compilation j'ai le message variable non définie et ça me surligne cette ligne :

    toutou = n

    mais ya pas besoin de définir de variable ici c'est quoi cette histoire ?

    merci
      0  0

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Salut
    il te manque un "End If"
    si tu mets -1 => avec le end if, la function renvoit bien -1, mais
    tu utilises la fonction en boucle et tu as une erreur de "#valeur " du au dépassement de capacité, puisqu'à chaque appel
    n secondaire devient ((n*(n + 1) * (2 * n + 1)) / 6)
    si f(n)=((n*(n + 1) * (2 * n + 1)) / 6)
    toutou (2) = toutou(f(2)) = toutou(f(f(2))) etc.
    et Excel dépasse la capacité de Long et renvoit une erreur
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function toutou(ByVal n As Long) As Long
    If n >= 0 Then
        toutou = ((n * (n + 1) * (2 * n + 1)) / 6)
    Else
       toutou = n
    End If
    End Function
    ça marche
    A+
      0  0

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    c'est gentil de répondre mais ça serait plus gentil de ne pas mettre de code tt fait sinon je bosse pas , j'ai une question :

    c'est de la récursivité que je dois employer donc je peux pas écrire toutou = formule , je dois écrire :

    toutou = toutou(...)

    vu que c'est une fonction qui s'appelle , toi ton code n'est pas récursif .
      0  0

  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
    juste un mot, maxence :

    n ne sera jamais inférieur à 0 avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toutou = toutou((n*(n + 1) * (2 * n + 1)) / 6)
    et ta récursivité sera alors sans fin.
      0  0

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    oui ucfoutu et je me rappelle bien d'un message de pgz quii disait qu'il fallait que n converge pour que la fonction soit récursive mais ici j'ai 2 questions :

    1.est ce que le code de gorfael donne une fonction récursive ? Je dirai NON mais j'attends confirmation

    2.est ce que cette modification rend ma fonction récursive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toutou = toutou(n-1)* ((n + 1) * (2 * n + 1)) / 6)
    merci
      0  0

  6. #6
    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
    Oui aux deux réponses.
    Seule ta fonction est récursive et elle l'est sans fin ...
      0  0

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    alors comment modifierais tu ma modification pour que mon toutou = toutou(n-1)* ((n + 1) * (2 * n + 1)) / 6) possède une fin ?

    et je ne vois pas en quoi la fonction de Gorfael est récursive vu qu'elle ne s'appelle pas...
      0  0

  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
    1) je t'ai précisément confirmé :

    Seule ta fonction est récursive et elle l'est sans fin ...
    2)

    Citation Envoyé par Maxence45 Voir le message
    c'est gentil de répondre mais ça serait plus gentil de ne pas mettre de code tt fait sinon je bosse pas , j'ai une question :
    .
    Alors ? ...
    comment modifierais tu ma modification pour que mon toutou = toutou(n-1)* ((n + 1) * (2 * n + 1)) / 6)
    a) n'appelle pas de réponse possible (car ce serait donner un code et tu as été clair sur ce point).
    b) ne risque pas d'en appeler dès lors que l'on ne connait pas la finalité même de la fonction (le résultat à retourner)..


    Bon travail.
      0  0

  9. #9
    Débutant
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Points : 107
    Points
    107
    Par défaut
    non mais maintenant que j'ai la réponse on peut poster des codes voyons , donc si j'ai çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function toutou(ByVal n As Long) As Long
     
    If n >= 0 Then
        toutou = toutou(n-1)* ((n + 1) * (2 * n + 1)) / 6)
    Else
       toutou = n
     
    End Function
    tu dis que ce code est sans fin ? pourtant je décrémente bien n à chaque appel de fonction...
      0  0

  10. #10
    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
    Ah oui, je vois que ton premier code :

    Citation Envoyé par Maxence45 Voir le message
    Bonsoir , dans cette fonction que j'ai écrite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function toutou(ByVal n As Long) As Long
    
    If n >= 0 Then
        toutou = toutou((n*(n + 1) * (2 * n + 1)) / 6)
    Else
       toutou = n
    
    End Function

    a été entre temps bouleversé (le n est devenu n-1)

    Mais je vois un drôle de truc .... (compte donc tes parenthèses) ...

    dans ;

    toutou = toutou(n-1)* ((n + 1) * (2 * n + 1)) / 6)
    Allez

    Bon appétit...
      0  0

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Points : 2 443
    Points
    2 443
    Par défaut
    Citation Envoyé par Maxence45 Voir le message
    c'est gentil de répondre mais ça serait plus gentil de ne pas mettre de code tt fait sinon je bosse pas , j'ai une question :

    c'est de la récursivité que je dois employer donc je peux pas écrire toutou = formule , je dois écrire :

    toutou = toutou(...)

    vu que c'est une fonction qui s'appelle , toi ton code n'est pas récursif .
    Salut
    Pour te donner une réponse, il faudrait qu'on ait une idée de la question !
    Comme je ne sais pas ce que tu attends, j'ai donné une solution, qui corrige ton erreur (manque end if), mais qui donne un résultat différent d'une erreur.
    Ta formule avec n-1 est finie, mais comme tu ne donnes aucune indication
    sur ce que tu espères trouver, on peut chercher pendant des mois, ce ne serait que chance que de partir dans la bonne direction.

    Une fonction recursive doit avoir un résultat fini pour qu'Excel te le donnes. Mais pour que ça fonctionne, on doit avoir une idée du résultat.

    Pour l'instant je ne sais ni la finalité de la formule, ni ce que tu cherches sur le forum.
    J'abandonne
    A+
      0  0

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/05/2014, 12h53
  2. Interruption d'une boucle - variable non définie
    Par Sérendipité dans le forum Programmation multimédia/Jeux
    Réponses: 14
    Dernier message: 16/04/2011, 22h53
  3. ++ sur une variable non définie
    Par sabotage dans le forum Langage
    Réponses: 3
    Dernier message: 31/10/2008, 16h19
  4. Test multiple sur une variable non définie
    Par Rei Angelus dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 12/12/2007, 22h01
  5. [debutant] get image avec une variable non static
    Par laguna dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2006, 15h57

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