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 :

[VBA][Débutante] Fonction Excel avec Boucle


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut [VBA][Débutante] Fonction Excel avec Boucle
    Bonjour,
    Je ne suis pas de tout informaticienne, et c'est bien mon problème!
    J'ai besoin de créer une fonction dans excel qui me permette de :

    un type a N souris, dont le nombre double tous les mois (nb_iteration = nombre de mois...). Quand ce nombre dépasse 1000, il en vend 1000.
    Mon but serait d'afficher toutes les valeurs dans une colonne excel pour ensuite faire un graphe (quant à faire directement le graphe à partir de la fonction je n'y pense même pas même si je suis sûre que c'est possible), mais je n'en suis même pas là...
    J'ai écrit la fonction suivant, mais elle ne marche pas (ça fait planter excel : "impossible de traiter votre question").

    Le but est ensuite de voir la tronche du graphe quand on part de 40, 41, 42 souris (nb_init)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Function souris(nb_init, nb_iteration)
     
    nb_fin = 0
    i = 0
     
    For i = 1 To nb_iteration
      Do While nb_fin < 1000
      nb_fin = 2 * nb_init
      If nb_fin > 1000 Then nb_fin = nb_fin - 1000
      Else: Loop
    Next i
     
    End Function
    Si par hasard quelqu'un comprend pourquoi ça ne marche pas... Ou a une idée pour faire autrement, je suis preneuse, ça m'enlèverait une grosse épine du pied!

    Merci beaucoup d'avance!

  2. #2
    Membre expérimenté Avatar de Mandalar
    Profil pro
    Étudiant
    Inscrit en
    Mai 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2004
    Messages : 121
    Par défaut
    D'un point de vue purement syntaxique, il me semble que le "Else" est de trop, ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Command1_Click()
    nb_fin = 0
    i = 0
     
    For i = 1 To nb_iteration
        Do While nb_fin < 1000
            nb_fin = 2 * nb_init
            If nb_fin > 1000 Then nb_fin = nb_fin - 1000
        Loop
    Next i
    End Sub
    Sinon je ne comprends pas a quoi correspond 'nb_iterations', ni meme les autres variables mais celle la en particulier car il me semble qu' "executer" la boucle pour i = nb_iteration une seule fois aurait le meme effet.

    Ps: pense a utiliser les balises code pour aider a la lisibilité

  3. #3
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    L'idée des boucles est OK : La boucle For pour un nombre d'itérations fixe, et le Do While pour la soustraction. C'est juste l'ordre des instructions ensuite qui est à rectifier :

    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
    Function souris(nb_init, nb_iteration)
     
        nb_fin = 0
        i = 0
     
        For i = 1 To nb_iteration
            'D'abord on multiplie par 2
            nb_fin = 2 * nb_init
     
            'Ensuite, on retranche les ventes
            Do While nb_fin < 1000
                If nb_fin > 1000 Then 
                    nb_fin = nb_fin - 1000
                End If
            Loop
        Next i
     
    End Function
    Mais il existe une fonction MOD (modulo) qui simplifie la 2° partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function souris(nb_init, nb_iteration)
     
        nb_fin = 0
        i = 0
     
        For i = 1 To nb_iteration
            'D'abord on multiplie par 2
            nb_fin = 2 * nb_init
     
            'Ensuite, on retranche les ventes
            nb_fin = Mod(nb_fin, 100)
        Next i
     
    End Function
    Bon, ça n'est pas testé, pas de VB à la maison, tu nous dis si ça t'aide
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  4. #4
    Membre expérimenté Avatar de Mandalar
    Profil pro
    Étudiant
    Inscrit en
    Mai 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2004
    Messages : 121
    Par défaut
    Si on prend pas a pas la boucle for, il me semble tout de meme qu'il y a un probleme (ou alors je suis vraiment tres fatigué ):

    une fois la boucle passé une fois, le nb_fin a été décrémenté correctement, mais on remonte au début, donc on lui re-attribue le double de nb_init, ce qui a pour effet de recommencer a retrancher les ventes alors que le premier passage la déja fait!

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    Koukou!

    Dis donc, je ne m'attendais vraiment pas à ce que vous répondiez aussi vite! Merci beaucoup!!

    En fait j'ai collé ma fonction dans un nouveau fichier, et là excel a arrêté de refuser de "traiter ma question", e-t du coup il m'a ensuite sorti les erreurs standars de compilation, et grâce à vos remarques j'ai réussi à en faire une autre, qui marche (cf ci dessous).
    Je n'ai pasutilisé le coup du mod car je ne comprends pas trop ce que ça fait... Pis comme ça marche ;o)
    Bon évidemment je suis encore loin de la création d'un tableau (colonne avec les i et colonne avec les valeurs de la fonction correspondant à chaque i...?) qui ensuite me fera un graphique, mais là je ne sais vraiment pas comment faire!
    Enfin, je vais chercher!

    Merci encore à tous :o)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function Souris(nb_init, nb_iteration)
     
    Souris = nb_init
    i = 0
     
    Do While i < nb_iteration
      Souris = 2 * Souris
      i = i + 1
      If Souris > 1000 Then Souris = Souris - 1000
    Loop
     
    End Function

  6. #6
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Si je peux me permettre un petit commentaire (je l'ai déjà dit mais bon ) : Pour une boucle dont le nombre d'itération est connue à l'avance, l'idéal est un For.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function Souris(nb_init, nb_iteration)
     
    Souris = nb_init
     
    For i = 1 To nb_iteration
      Souris = 2 * Souris
      If Souris > 1000 Then Souris = Souris - 1000
    Next i
     
    End Function
    De plus, dans ta fonction, tu ne retranche qu'une seule fois mille : si par hasard la variable Souris est supérieure à 2000, alors tes calculs seront faux. Ceci peut arriver si tu démarres avec un grand nombre de souris (ex : 1500) : c'est l'intérêt de la fonction MOD. Si tu ne connais pas cette fonction, un petit F1 sous Excel devrait t'aider
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    Koukou
    Désolée de te faire te répéter!
    Je vais changer et mettre un For à la place d'un do while!
    Pour le mod, il faudra que je me trouve l'aide Excel et que je l'installe (pour une raison étrange elle n'y est pas), mais ce petit problème n'est pas important pour ce que je vais en faire.
    Merci encore!

  8. #8
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Si ça marche comme c'est, le mieux est de ne pas y retoucher alors
    (vieux proverbe informaticien)

    Sinon, pour info :
    Citation Envoyé par Aide Excel
    MOD
    Voir aussi

    Renvoie le reste de la division de l'argument nombre par l'argument diviseur. Le résultat est du même signe que diviseur.

    Syntaxe

    MOD(nombre;diviseur)

    nombre représente le nombre à diviser pour obtenir le reste.

    diviseur représente le nombre par lequel vous souhaitez diviser le nombre. Si diviseur est égal à 0, MOD renvoie la valeur d'erreur #DIV/0!
    Ex :
    MOD (1432; 1000) = 432
    MOD (2432; 1000) = 432
    ...
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    Ok, merci!
    Ben je vais quand même essayer de le mettre, c'est tellement plus élégant ;o)

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    à signaler que quelle que soit la valeur de départ on tombe rapidement
    sur une fonction cyclique sauf pour les multiples de 125 qui partent en retraite

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    Bon ben j'ai essayé de mettre le mode, mais il me dit, en surlignant "MOD" : erreur de compilation, attendu : expression, quelque soit l'endroit où je le mette... Je ne comprends pas bien son problème, ça me fait la même erreur si je remplace la variable Souris par un nombre (ex, 3000)...

    nb_fin = MOD(Souris;1000)

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    Citation Envoyé par random
    à signaler que quelle que soit la valeur de départ on tombe rapidement
    sur une fonction cyclique sauf pour les multiples de 125 qui partent en retraite
    Ah c'est super cette observation!
    Pour tout vous avouez, je fais ça pour essayer de comprendre des bases de la théorie du chaos, effet papillon, tout ça... Malheureusement je suis une biologiste donc je lutte un peu ;o)
    Donc, merci!

  13. #13
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Citation Envoyé par Inelukia
    Bon ben j'ai essayé de mettre le mode, mais il me dit, en surlignant "MOD" : erreur de compilation, attendu : expression, quelque soit l'endroit où je le mette... Je ne comprends pas bien son problème, ça me fait la même erreur si je remplace la variable Souris par un nombre (ex, 3000)...

    nb_fin = MOD(Souris;1000)
    Pardon, ce que j'ai indiqué, c'est la syntaxe sous Excel, dans une cellule ...

    En VB (donc en VBA je pense), ça s'écrit comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb_fin = Souris Mod 1000
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Par défaut
    en fait il y a quatre famille de fonctions
    la famille de base 1, 1 2 4.. qui tombe dans le cycle 8 longueur du cycle 100
    la famille de base 5 qui tombe dans le cycle 40 de périodicité 23
    la famille de base 25 qui tombe dans le cycle 200 de périodicité 4
    la famille de base 125 qui s'acheve avec un cycle 1 à 0 ou 1000 selon la limite

    et quatre courbes seulement (c'est pas un chaos d'enfer)

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    Exact! Du coup maintenant ça marche ;o)
    Sauf que j'ai l'impression que, ci dessous, ça ne marche pas, je suppose que c'est dû à la façon dont MOD marche...?
    (NB : ça marche si je remets If Souris3 > 1 Then Souris3 = Souris3 - 1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function Souris3(nb_init, nb_iteration)
    'nb_init doit être compris entre 0 et 1
     
    Souris3 = nb_init
    i = 0
     
    For i = 1 To nb_iteration
      Souris3 = 2 * Souris3
      Souris3 = Souris3 Mod 1
    Next i
     
    End Function

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je reviens à ça
    For i = 1 To nb_iteration
    Do While nb_fin < 1000
    nb_fin = 2 * nb_init
    If nb_fin > 1000 Then nb_fin = nb_fin - 1000
    Else: Loop
    Next i
    Tu n'étais pas loin puisque tu aurais pu faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    For i = 1 To nb_iteration 
      Do While nb_fin < 1000 
            nb_fin = 2 * nb_init 
            If nb_fin > 1000 Then
                  nb_fin = nb_fin - 1000 
               Else
                  exit do
            Endif
      Loop 
    Next i
    juste pour que tu saches que ce que tu voulais faire n'était pas si bête

    A+

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    Citation Envoyé par random
    en fait il y a quatre famille de fonctions
    la famille de base 1, 1 2 4.. qui tombe dans le cycle 8 longueur du cycle 100
    la famille de base 5 qui tombe dans le cycle 40 de périodicité 23
    la famille de base 25 qui tombe dans le cycle 200 de périodicité 4
    la famille de base 125 qui s'acheve avec un cycle 1 à 0 ou 1000 selon la limite

    et quatre courbes seulement (c'est pas un chaos d'enfer)
    Effectivement... Mais ça suffira pour les bases a priori, car le but est de voir que si on part de nombres très proches on obtient des nombres de plus en plus éloignés...?
    Comment as-tu fais pour faire ces observations?
    Moi, à moins de faire un graphe... ;o)

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    Citation Envoyé par ouskel'n'or
    juste pour que tu saches que ce que tu voulais faire n'était pas si bête
    Merci ;o)

  19. #19
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Mod te donne un reste de division entière : si tu fais "nb Mod 1", tu obtiendras donc forcément 0 ?

    Ca revient à dire que dès que ton gars à 1 souris, alors il la vend ... dur pour elles de se reproduire dans ses conditions
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    Effectivement ce n'est plus applicable à un système réel, mais le but c'était de pouvoir entrer comme nombre initial des nombres aussi proches qu'on le souhaite... Ca permet de tester de tous petis écarts.


    Bon, par contre je n'arrive pas à me dépatouiller de mon tableu virtuel.
    Je voudrais entrer dans un tableau (à une dimension ça suffit...) toutes les valeurs de la fonction.
    Le problème c'est que je ne peux pas faire ça :
    Dim Tableau(nb_iteration) As Integer

    Du coup j'essaye de m'en sortir avec la commande ReDim, en augmentant d'une ligne le tableau à chaque fois que la boucle est réalisée, mais ça ne marche pas pour l'instant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function Souris5(nb_init, nb_iteration)
     
    Souris5 = nb_init
    i = 0
    Dim Tableau() As Integer
     
    For i = 1 To nb_iteration
      Souris5 = 2 * Souris5
      If Souris5 > 1 Then Souris5 = Souris5 - 1
      Tableau(i) = Souris5
      ReDim Tableau(i + 1)
    Next i
     
    End Function
    A la limite je peux m'en sortir pour mes tests en mettant un tableau à 1000 lignes, et en sachant que nb_iteration doit être < 1000, mais bon ce serait plus élégant de ne pas être limitée...

    Mon plus gros soucis c'est que je n'arrive pas à trouver sur le net comment faire pour que le tableau soit le résultat de la fontion (que les différentes valeurs apparaissent dans une colonne d'une feuille excel)!

    Si quelqu'un a une idée... ;o)

    Edit
    Pense à mettre les bornes Code en début et fin de code, c'est plus clair...
    (ajoutées par ouskel'n'or)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2010] Code VBA: somme de cellules avec boucle unique
    Par Thomas4530 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/01/2014, 05h16
  2. [XL-2010] Envoi mail par excel avec boucle pour tous les champs
    Par jul2012 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/11/2012, 14h54
  3. [VBA]Utiliser les fonctions Excel avec Access
    Par PsykotropyK dans le forum VBA Access
    Réponses: 8
    Dernier message: 18/04/2007, 13h58
  4. [VBA-E] Fonction excel DISTINCT
    Par repié dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/03/2007, 07h45
  5. Réponses: 2
    Dernier message: 13/12/2006, 13h33

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