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 :

Boucle et stockage des résultats


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Boucle et stockage des résultats
    Bonjour, je voudrais créer une boucle dans un programme d'évaluation d'option afin de refaire le programme 100 fois, mais j'aurais également aimé que chacun des résultats (100) soient stockés au fur et a mesure dans la 2e feuille excel.....

    Merci d'avance pour votre aide (voir programme en question ci bas)

    =========================
    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
    Sub simopt()
    'Début de boucle ici
    Range("d4:iv6000").ClearContents
    Range("option1").ClearContents
    Dim iopt1, s1, x1, rf1, q1, t1, sigma1, nsigma1, pas
    Dim rnmutg, sigtg, sumg, randnsg, S1g, payoff1g, sigsum, sigmoyenne
    Dim i As Integer
    Dim j As Integer
    iopt1 = -1
    s1 = 79
    x1 = 86
    rf1 = 0.05
    q1 = 0
    t1 = 1
    sigma1 = 0.27
    pas = 100
    nsimg1 = 115
    rnmutg = (rf1 - q1 - 0.5 * sigma1 ^ 2) * (t1 / pas)
    sigtg = sigma1 * Sqr(t1 / pas)
    sumg = 0
    For i = 1 To nsimg1
        S1g = s1
        sigsum = 0
        For j = 1 To pas
            Randomize
            randnsg = Application.NormSInv(Rnd)
            S1g = S1g * Exp(rnmutg + randnsg * sigtg)
            'Range("prix1").Offset(j - 1, i - 1) = S1g
            sigsum = sigsum + S1g
        Next j
        sigmoyenne = sigsum / pas
        'Range("prix").Offset(i - 1, 0) = sigmoyenne
        payoff1g = Application.Max(iopt1 * (sigmoyenne - x1), 0)
        'Range("cash").Offset(i - 1, 0) = payoff1g
        sumg = sumg + payoff1g
    Next i
    option1 = Exp(-rf1 * t1) * sumg / nsimg1
    Range("option1").Value = option1                                                (Résultat à stocker)
    'Fin de boucle
    End Sub

  2. #2
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Bonjour Golden, bienvenue sur le forum.
    Quelle variable te donne le résultat à stocker ? S1g, payoff1g ou sumg ? ou les trois ? Y a-t-il un libellé ?
    A+

    NB - Pense à indenter ton code pour le mettre sur le forum (tel qu'il était il était illisible) ainsi qu'à le baliser

  3. #3
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 652
    Points : 34 360
    Points
    34 360
    Par défaut
    bonjour golden 7B, et bienvenu sur DVP
    je peux te proposer cette méthode (en fin de code à la place du:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("option1").Value = option1
    je mettrais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil2").Range("A" & Worksheets("Feuil2").Range("A65000").Row +1).Value = option1

  4. #4
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message
    Bonjour Golden, bienvenue sur le forum.
    Quelle variable te donne le résultat à stocker ? S1g, payoff1g ou sumg ? ou les trois ? Y a-t-il un libellé ?
    A+

    NB - Pense à indenter ton code pour le mettre sur le forum (tel qu'il était il était illisible) ainsi qu'à le baliser

    Daccord (quelle est la différence entre identer et baliser?) merci

    variable = Range("option1").Value = option1

  5. #5
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par jpcheck Voir le message
    bonjour golden 7B, et bienvenu sur DVP
    je peux te proposer cette méthode (en fin de code à la place du:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("option1").Value = option1
    je mettrais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil2").Range("A" & Worksheets("Feuil2").Range("A65000").Row +1).Value = option1

    daccord, merci je vais essayer ca, et pour la boucle j'en fais une normal : ex.:
    For e = 1 to 100, etc..?

    merci

  6. #6
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Citation Envoyé par Golden7B
    Quelle est la différence entre identer et baliser?
    Indenter revient à placer une marge dans ton code situé à l'intérieur d'une boucle. Je l'ai fait pour toi dans la boucle For... Next, jète un oeil
    Baliser ton code permet de le reproduire tel qu'il est dans ton module. En mode d'édition, quand tu rédiges ton message, il y a plein de boutons en dessus de la zone de texte. Pour baliser ton code, tu le sélectionnes et tu fais un clic sur l'icône #. Pour citer une réponse, soit tu utilises le bouton "Citer" en bas de la réponse que l'on t'a donnée, soit tu encadres la copie de la partie de la réponse que tu veux citer des balises [ QUOTE ] et [ /QUOTE ] (sans espace) icône texte dans une bulle.
    Ne t'inquiète pas, ça vient vite

    Pour la réponse précédente, je doute... Je n'ai pas vu que tu voulais placer le résultat à partir de la ligne 65000

    A part ça, je n'ai pas vu de réponse à mes questions

    Enfin, quand tu fais "variable = Range("option1").Value = option1" tu veux une réponse Vrai ou faux ? variable est un boolean ?
    A+

  7. #7
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ouskel'n'or Voir le message

    Pour la réponse précédente, je doute... Je n'ai pas vu que tu voulais placer le résultat à partir de la ligne 65000
    Non effectivement, je veux que ce soit dans les cellules A1 à A100 (bref, 100 résultats indépendants....)

    Citation Envoyé par ouskel'n'or Voir le message
    A part ça, je n'ai pas vu de réponse à mes questions
    La seul variable qui m'intéresse est vraiment la valeur de "option1"

    Citation Envoyé par ouskel'n'or Voir le message
    Enfin, quand tu fais "variable = Range("option1").Value = option1" tu veux une réponse Vrai ou faux ? variable est un boolean ?
    A+
    Je suis désolé, je ne sais pas ce qu'est un boolean, mais je veux la valeur de option 1 (un chiffre) et par la suite, réinitialiser le programme au complet.... donc refaire le programme 100 fois indépendamment des résultats donnés.......(pour par la suite créer une distribution des résultats trouvés....)

  8. #8
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 652
    Points : 34 360
    Points
    34 360
    Par défaut
    elle le prend déjà en compte, mais si tu as déjà une valeur dans la cellule A151, tu vas l'écraser à chaque fois, le principe étant de partir d'une valeur très grande pour être sur de ne pas finir par écraser les cellules.

  9. #9
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par jpcheck Voir le message
    elle le prend déjà en compte, mais si tu as déjà une valeur dans la cellule A151, tu vas l'écraser à chaque fois, le principe étant de partir d'une valeur très grande pour être sur de ne pas finir par écraser les cellules.
    Ok, mais moi, techniquement, je voudrais n'avoir qu'à rouler mon programme une seule fois et par la suite, retrouver 100 résultats dans les cellules A1 à A100...

    Merci

  10. #10
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 652
    Points : 34 360
    Points
    34 360
    Par défaut
    J'ai bien compris, le principe de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil2").Range("A" & Worksheets("Feuil2").Range("A65000").Row +1).Value = option1
    est de mettre le résultat option1 dans la premiere ligne vide de la colonne A, ça n'a rien à voir avec le fait d'avoir 1 ou 8000 traitements.
    Si tu fais 100 traitements, tu fais directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("feuil2!").Range("A" & i).Value = option1

  11. #11
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Ok, mais mon prob, c'est que avec ta première suggestion, il ne met que un seul résultat dans la cellule A65001...

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    bonjour

    Il y a au moins deux problèmes dans ton code.

    Le premier, c'est que la ligne qui attribue la valeur Option1 à une cellule est en dehors de la boucle. Il y a donc peu de chances que tu récupères plusieurs valeurs.
    Le second, c'est qu'il faut demander à Excel d'aller chercher la dernière cellule non vide en commençant par le bas, puis de décaler d'une ligne vers le bas. C'est pourquoi je te propose de placer, en A1 de Feuil2, le texte "Option 1". La fin de la boucle telle que je te la donne plus bas placera les résultats en A2... jusque A101, si ta boucle renvoie 100 résultats, pour autant qu'il n'y ait aucune cellule remplie en dessous de A1.

    La ligne
    devrait se trouver juste avant la ligne
    La fin de la boucle devrait être ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            sumg = sumg + payoff1g
            option1 = Exp(-rf1 * t1) * sumg / nsimg1
            worksheets("feuil2").range("a" & rows.count).end(xlup)(2) = option1
        next i
    end sub
    Dans ce code, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("feuil2").range("a" & rows.count).end(xlup)(2) = option1
    va placer le résultat dans la cellule vide qui suit la dernière cellule remplie de la colonne. Donc, à chaque boucle, la valeur est placée une cellule plus bas. Cette solution te permet de ne pas devoir adapter ton code si tu décides de boucler 200 fois ou 1000 fois.

    Si tu lances ton programme plusieurs fois et que tu veux écraser tes résultats précédents, il te suffit de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worksheets("feuil2").range("a2:a" & rows.count).clearcontents
    en début de procédure, avant le début de la boucle sur i. Cette solution est également applicable quel que soit le nombre de boucles.

    Ok?

  13. #13
    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
    Points : 15 546
    Points
    15 546
    Par défaut
    Désolé, j'ai dû m'absenter. Comme Pierre t'a répondu, je me contenterai de te parler des booléens... à défaut de t'aider
    Si tu mets -> variable = Range("option1").Value = option1 (tu as compris ce que tu dois mettre à la place) c'est comme si tu disais
    Si (Range("option1").Value = option1) alors Variable = vrai
    Et ce n'est pas ce que tu veux
    A toutes fins utiles
    A+

  14. #14
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup Pierre, ça fonctionne très bien!! Merci aussi à tous les autres pour votre aide.

    *Pour la boucle Next i, il faut bel et bien qu'elle soit avant la valeur d'option 1. En effet, ce programme est une simulation de MonteCarlo et donc il nécessite 2 boucles, soit une pour le nombre d'itérations (i) et une pour le nombre de pas (j).

    Donc ma troisième boucle (j'ai pris next e placé après la valeur d'option 1) est seulement pour refaire cette simulation 100 fois.... (le fait que le nombre de pas et mon nombre choisi de simulation soit les deux = à 100 peu porter à confusion....)

    Merci encore pour votre aide et ce n'est certainement pas la dernière fois que je vais la solliciter!!

  15. #15
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    Ok. Je n'avais pas compris la signification du
    Tant mieux si tout fonctionne. A bientôt sur nos forums

  16. #16
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 124
    Points : 55 919
    Points
    55 919
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par jpcheck Voir le message
    J'ai bien compris, le principe de cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil2").Range("A" & Worksheets("Feuil2").Range("A65000").Row +1).Value = option1
    est de mettre le résultat option1 dans la premiere ligne vide de la colonne A...
    Non, cette ligne place la valeur de Option1 dans la cellule A65001 de la feuille "Feuil2", sans qu'il y ait aucune incrémentation...

  17. #17
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 652
    Points : 34 360
    Points
    34 360
    Par défaut
    il fallait bien sûr lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil2").Range("A" & Worksheets("Feuil2").Range("A65000").End(XlUp).Row +1).Value = option1

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

Discussions similaires

  1. Calcul avec la boucle for et stockage des résultats
    Par Wel Kol dans le forum MATLAB
    Réponses: 5
    Dernier message: 02/04/2014, 11h21
  2. stockage des résultats dans un fichier texte
    Par nizar_triki dans le forum C++
    Réponses: 4
    Dernier message: 16/04/2012, 15h24
  3. Réponses: 5
    Dernier message: 30/06/2008, 14h43
  4. [Preferences] Stockage des options
    Par Yan83 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 03/05/2004, 10h38
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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