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

VB.NET Discussion :

comparaison avec test


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2010
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 79
    Par défaut comparaison avec test
    bonjour ,
    desolé de vous deranger vu que mon probleme a l'air banale
    'voila j'ai deux boucles inbriquées la deuxieme for j=0 to nb_annee... est celle qui me calcule ma somme
    'une fois cette somme calculée je voudrai la comparer a un nombre fixe en ajoutant au denominateur un nombre
    'tres petit "alpha" bien entendu si ma somme est inferieur a ce nombre fixe je doit prendre alpha negatif ,dans le
    'cas contraire je prend alpha positif
    'j'ai donc mis une condition d'arret si la difference des deux nombres est inferieur à 0.0001 la boucle sur alpha
    'devrais s'arreter puis me mettre ce dernier alpha en colone V a la ligne consideré
    'voila j'ai bricolé un code mais qui ne fait pas ce que je veux
    'voici la partie du code concernée:

    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
            For alpha = 0 To 10 Step 0.0001
            somme = 0
                    For j = 0 To nb_annee - 1
                        If Int(nb_mois) = 0 Then
                        taux_spot_1 = Worksheets("Forwards").Cells(7 + 12 * j, 7).Value
                        taux_spot_2 = Worksheets("Forwards").Cells(11 + 12 * j, 7).Value
                        Else
                        taux_spot_1 = Worksheets("Forwards").Cells(Int(nb_mois) + 10 + 12 * j, 7).Value
                        taux_spot_2 = Worksheets("Forwards").Cells(Int(nb_mois) + 11 + 12 * j, 7).Value
                        End If
                                p = nb_mois / 12 + j
                                T = alpha + (g * taux_spot_2 + (30 - g) * taux_spot_1) / 3000
                                somme = somme + Worksheets("Feuil1").Cells(i + 6, 13).Value / (1 + T) ^ p
                    Next
                            p = nb_mois / 12 + nb_annee - 1
                            T = alpha + (g * taux_spot_2 + (30 - g) * taux_spot_1) / 3000
                            somme = somme + 100 / ((1 + T) ^ p)
                            diff = Abs(Worksheets("Feuil1").Cells(i + 6, "J").Value - somme)
     
     
                                If Worksheets("Feuil1").Cells(i + 6, "J").Value < _
                                Worksheets("Feuil1").Cells(i + 6, "K").Value Then
                                alpha = alpha
                                Else
                                alpha = -alpha
                                End If
                            If diff <= 0.001 Then
                            Worksheets("Feuil1").Cells(i + 6, "V").Value = alpha
                            Else
                            Worksheets("Feuil1").Cells(i + 6, "V").Value = ""
                            End If
     
              Next
    merci beaucoup de votre aide .

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Par défaut
    Bonjour

    J'ai relu ton topic au moins 6 fois, j'en ai fait autant pour ton code. Et Bah je ne sais pas comment tu fais pour ne pas te perdre dedans.

    Et sinon, il est ou le probleme, y'a une ligne qui ne passe pas, une message d'erreur qui apparait a un moment?

    Ou tu t'es juste trompé a un moment et comme tu connais ton code par cœur, tu n'arrives a pas voir la coquille?

    Si tu veux juste quitter tes boucles quand ta difference est inferieur ou egale a 0.0001 (d'ailleur dans ton code, tu as écris "0.001") il te suffit juste de faire un return ou un exit for juste apres avoir mis la valeur dans la colonne desirée)

    En esperant que ca t'aidera un peu

    Nasty

  3. #3
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Je rejoindrais Nasty sur le fait que si tu ne nous dis pas ce qui ne va pas, cela risque d'être dur de t'aider, et j'ajouterais que mes yeux sont piqués par le nombre de fautes d'orthographes.

    Ensuite tu met ton somme = 0 dans ta boucle, donc pour chaque nouveau alpha ton "somme" revient à 0, je ne sais pas si c'est vraiment voulu, moi aussi j'ai du mal à comprendre ton code.

    Merci de nous éclaircir .

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2010
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 79
    Par défaut comparer somme et nombre fixe
    voila le code complet avec explication

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    Sub calcul_des_spread()
    Dim i As Long
    Dim j As Long, ind() As Long
    Dim g As Double
    Dim T As Double
    Dim p As Double, alpha As Double
    Dim nb_mois As Double
    Dim nb_annee As Double
    Dim nb_trim As Double
    Dim nb_jr As Double
    Dim nb_semestre As Double
    Dim somme As Single
    Dim taux_spot_1 As Double, diff As Double
    Dim taux_spot_2 As Double
    ' prix sur les obligations a coupon annuel
    For i = 0 To Worksheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row - 6
    '//ci-dessous je mets une condition sur la ligne pour que ma boucle sur i s'execute lorsqu'on
    'rencontre l'un des caracteres An,..,In Fine.
       If Worksheets("Feuil1").Cells(i + 6, 9).Text Like "*AnLD*" _
                 Or Worksheets("Feuil1").Cells(i + 6, 9).Text Like "*An*" _
                 Or Worksheets("Feuil1").Cells(i + 6, 9).Text Like "*AnRD*" _
                 Or Worksheets("Feuil1").Cells(i + 6, 9).Text Like "*AnRDFo*" _
                 Or Worksheets("Feuil1").Cells(i + 6, 9).Text Like "*In Fine*" Then
                 '//une deuxieme condition sur le contenu de cette cellule
                    If Worksheets("Feuil1").Cells(i + 6, 14).Value <> "" Then
                    '//il s'agit d'un nombre d'année calculé a partir par exemple d'une date fixe
                    'donc c'est en general un nombre decimal
                        nb_annee = Worksheets("Feuil1").Cells(i + 6, 14).Value
                        'bien evidemment le nombre de mois restant avant la prochaine année en enlevant les années pleine c'est
                        'la partie decimale du nombre d'années multiplié par 12
                        nb_mois = (nb_annee - Int(nb_annee)) * 12 'nombre de mois avant la prochaine année
                        If (nb_annee - Int(nb_annee)) > 0 Then
                        nb_annee = Int(nb_annee) + 1
                        Else
                        nb_annee = nb_annee
                        End If
     
                            somme = 0
                            'g represente le nombre de jours (partie decimale du nombre de mois)
                            g = (nb_mois - Int(nb_mois)) * 30
        '// ci-dessous je veux faire une boucle sur alpha pour comparer la somme de ma boucle sur j
        'a un nombre positif .et comme alpha est tres petit raison pour laquelle je prend un pas de 0.0001
     
            For alpha = 0 To 10 Step 0.0001
            '// ici j'initialise la somme a zero pour chaque nouveau alpha
            somme = 0
                    For j = 0 To nb_annee - 1
                    '// ce if c'est pour prendre des données dans une feuille noté Forwards
                        If Int(nb_mois) = 0 Then
                        taux_spot_1 = Worksheets("Forwards").Cells(7 + 12 * j, 7).Value
                        taux_spot_2 = Worksheets("Forwards").Cells(11 + 12 * j, 7).Value
                        Else
                        taux_spot_1 = Worksheets("Forwards").Cells(Int(nb_mois) + 10 + 12 * j, 7).Value
                        taux_spot_2 = Worksheets("Forwards").Cells(Int(nb_mois) + 11 + 12 * j, 7).Value
                        End If
                                p = nb_mois / 12 + j
                                T = alpha + (g * taux_spot_2 + (30 - g) * taux_spot_1) / 3000
                    '// je calcule une partie de ma somme a l'aide d'une formule ,T et P se calculent aussi par des formules
                                somme = somme + Worksheets("Feuil1").Cells(i + 6, 13).Value / (1 + T) ^ p
                    Next
                            p = nb_mois / 12 + nb_annee - 1
                            T = alpha + (g * taux_spot_2 + (30 - g) * taux_spot_1) / 3000
                            '// resultat final de ma somme
                            somme = somme + 100 / ((1 + T) ^ p)
                    '// une fois ma somme calculé je fais le test pour chaque alpha ,j'ajoute alpha
                    'dans T ainsi pour un certain alpha je vais trouver que ma somme est tres proche
                    'du nombre qui est :Worksheets("Feuil1").Cells(i + 6, "J").Value j'ai donc mi une condition d'arret
                    'lorsque la differrence entre les deux nombres est <=0.0001 ,c'est pourquoi je fait
                    'le "diff" ci -dessous:
                            diff = Abs(Worksheets("Feuil1").Cells(i + 6, "J").Value - somme)
                  '// alpha ne peu toujours pas etre positif cela depend de la somme trouvée et du nombre fixe en colonne J
                  'si je veux que les deux nombres se rapprochent il va falloir prendre alpha positif si ma somme est > au nombre
                  'avec le quel je fait ma comparaison situé en colonne J sinon je prend alpha negatif
     
                                If Worksheets("Feuil1").Cells(i + 6, "J").Value < _
                                Worksheets("Feuil1").Cells(i + 6, "K").Value Then
                                alpha = alpha
                                Else
                                alpha = -alpha
                                End If
                                'une fois la condition est verifier mettre la valeur de cet alpha qui
                                'me verifie au mieux la condition "diff"en colonne V et sortir de la boucle puis
                                'aller a l'indice i suivant .
                            If diff <= 0.0001 Then
                            Worksheets("Feuil1").Cells(i + 6, "V").Value = alpha
                            Exit For
                            End If
     
              Next
            End If
        End If
    Next
    end sub
    le code tourne deja pour i=0 jusqua i=18,il me donne les valeurs de alpha de la ligne 6 a la ligne 24 ,mais apres il se bloc !!
    (Microsoft excel Ne repond pas !!) je ne sais pas quoi faire

    merci de votre aide .

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Par défaut
    Tu n'as aucune exception de générée?

    Déjà avant toute chose, met tout ca dans des try catch parce que c'est un gros processus que tu fait et il est preferable de pouvoir intercepter les possibles erreurs.

    J'ai déjà eu des plantages avec Excel parce que je cliquais dans une cellule pendant le traitement, ce qui perturbait le traitement, mais jamais une boucle qui "freezait" Excel

    Et tu as essayé en utilisant .Range et pas .Cell? Je ne sais pas si ca a un impact (faut dire que je n'utilise que .Range) mais bon, c'est peut etre la technique qui est mauvaise.

    Nasty

  6. #6
    Membre émérite Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Par défaut
    Peut-être parce que ton nombre d'itération est grand ?

    Première itération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     For j = 0 To nb_annee - 1
    Je sais pas de combien à combien cela varie (on va dire 5)
    On tourne sur du 5
    Deuxième itération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For alpha = 0 To 10 Step 0.0001
    On tourne sur du 100000
    Troisième itération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 0 To Worksheets("Feuil1").Cells(Rows.Count, 1).End(xlUp).Row - 6
    La encore je ne sais pas combien, mais puisque tu dis i = 18.
    On tourne sur 18 itérations

    Soit 18*100000*5 = 9000000 je te laisse comprendre que cela puisse commencer à freezer ...

    Et encore j'ai probablement minimiser !

    Enfin ça m'étonnerait sachant que je penses qu'on peut faire bien pire.

    J'ai mal à la tête j'ai pas réussi à tout lire, tu ferais mieux d'aller sur mathématica ou sur mapple, ou encore d'utiliser du fortran :-).

Discussions similaires

  1. excel : formule si avec test sur case précédente
    Par tibyann dans le forum Excel
    Réponses: 7
    Dernier message: 03/02/2006, 15h43
  2. comparaison avec substring
    Par tidan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2005, 17h13
  3. Création vue avec test d'existence
    Par yan77 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/12/2004, 11h44
  4. [PHP-JS] var javaScript avec test php
    Par lepierre dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/12/2004, 12h58
  5. UPDATE d'une table avec test d'un champ d'une autre table
    Par delphim dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/05/2004, 12h30

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