Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2937 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Condition If...End if à l'intérieur d'une boucle For...Next

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Condition If...End if à l'intérieur d'une boucle For...Next

n°1991378
Matrach
Posté le 07-05-2010 à 22:42:38  profilanswer
 

Bonsoir à tous,
 
Je débute dans la programmation sous VBA et je cherche à faire un programme pour éviter une erreur de référence circulaire sous Excel.
 
Je voudrais réaliser un programme afin de déterminer trois nombres x, y et z tels que :
z=2,45*y
x=0,75*(x+y)
x+y+z=515
 
Sachant que x varie de 515 à 0, que y varie de 0 à 150 et que je cherche à avoir une précision de 0,01 sur x, y et z.
 
J'ai tenté de faire un programme mais celui-ci ne fonctionne pas. Excel plante à chaque nouvel essai donc je n'arrive pas à savoir où se situent les erreurs. Je poste la programme ci-dessous :
 
Sub Rex ()
Dim x As Double
Dim y As Double
Dim z As Double
Dim u As Double
z = 2.45 * y
u = x + y + z
For x = 515 To 0 Step -0.01
For y = 0 To 150 Step 0.01
x = 0.75 * (x + y)
If u = 515 Then
Exit Sub
End If
Next y
If u = 515 Then
Exit Sub
End If
Next x
If u = 515 Then
Exit Sub
End If
 
 
Cells(1, 1).Value = x
Cells(2, 1).Value = y
Cells(3, 1).Value = z
Cells(4, 1).Value = u
 
End Sub
 
 
Merci d'avance pour votre aide!
 
Matrach
 

mood
Publicité
Posté le 07-05-2010 à 22:42:38  profilanswer
 

n°1991383
antac
..
Posté le 07-05-2010 à 23:50:27  profilanswer
 


Sub Rex ()
Dim x As Double
Dim y As Double
Dim z As Double
Dim u As Double
z = 2.45 * y
u = x + y + z
For x = 515 To 0 Step -0.01
    For y = 0 To 150 Step 0.01
        x = 0.75 * (x + y)
        If u = 515 Then
              Exit Sub
        End If
    Next y
    If u = 515 Then
        Exit Sub
     End If
Next x
 
If u = 515 Then
     Exit Sub
End If
 
 
Cells(1, 1).Value = x
Cells(2, 1).Value = y
Cells(3, 1).Value = z
Cells(4, 1).Value = u
 
End Sub
 
Il faut déjà penser à indenter ton code.
TU n'as pas de problème de syntaxe mais de logique.
au bout d'un moment sur ta ligne  x = 0.75 * (x + y)
x ne va qu'augmenter  
 
x=0.75*(0.8917+0.32)
ce qui fait que ton X n'atteindra jamais sa limite à 0 et ta boucle est illimité ce qui plante Excel.
 
Ensuite tu as un test qui ne sert à rien  
   If u = 515 Then
              Exit Sub
        End If
u ne varie jamais, l'affectation du début ne change pas.

n°1991403
Matrach
Posté le 08-05-2010 à 11:18:45  profilanswer
 

Merci beaucoup pour ces conseils.
 
Il est vrai que j'ai un problème de logique mais je n'arrive toujours pas à déterminer exactement où se situe l'erreur.
Il faudrait donc essayer de tester  l'équation x = 0.75 * (x + y) en même temps que de vérifier si u est bien égal à 515?
 
 
 
Sub Rex()
Dim x As Double
Dim y As Double
Dim z As Double
Dim u As Double
z = 2.45 * y
u = x + y + z
For x = 515 To 0 Step -0.01
    For y = 0 To 150 Step 0.01
       
        If x = 0.75 * (x + y) And u = 515 Then
              Exit Sub
        End If
    Next y
    Next x
 If x = 0.75 * (x + y) And u = 515 Then
              Exit Sub
        End If  
 
 
Cells(1, 1).Value = x
Cells(2, 1).Value = y
Cells(3, 1).Value = z
Cells(4, 1).Value = u
 
End Sub
 
Merci d'avance

n°1991404
antac
..
Posté le 08-05-2010 à 11:27:08  profilanswer
 

Pareil  
   
        If x = 0.75 * (x + y) And u = 515 Then
              Exit Sub
        End If  
 
u ne change jamais dans ta boucle, il a toujours la valeur que tu lui as affecté avant : u = x + y + z  
Il faut que tu intègres cette ligne dans la boucle

n°1991439
Matrach
Posté le 08-05-2010 à 14:28:39  profilanswer
 

D'accord donc je les inclue dans la boucle et je teste la somme u?
 
Sub Rex()
Dim x As Double, y As Double, z As Double, u As Double
 
For x = 515 To 0 Step -0.01
    For y = 0 To 150 Step 0.01  
        x = 0.75 * (x + y)
        z = 2.45 * y
        u = x + y + z
        If u = 515 Then
            Cells(1,1).Value = x
            Cells(1,2).Value = y
            Cells(1,3).Value = z
            Cells(1,4).Value = u
            Exit sub
        End If
    Next y
Next x
End Sub
 
Sauf que ça ne fonctionne toujours pas...
Bon ben merci pour tout en tout cas, je crois qu'on ne peux plus rien pour moi. :)
Je n'ai aucune logique.

n°1991451
antac
..
Posté le 08-05-2010 à 15:56:58  profilanswer
 

Tu sais que tu peux suivre au pas à pas ta requête.
Tu verras bien que u ne dépasse jamais 2
Ensuite un conseil, vu que tu travailles sur autre chose que des entiers, utilise "u>=" plutot que "u=".
 
Mais si tu nous expliquais ce que tu veux faire avec ton truc.

n°1991462
Matrach
Posté le 08-05-2010 à 18:11:55  profilanswer
 

Je te remercie pour tout antac. Tu as raison c'est à ce niveau qu'il y avait une erreur. J'ai été bête de croire que je pouvais tomber sur 515 tout pile.
 
En fait je souhaitais faire ce programme dans le cadre d'un travail en chimie.
 
Je fais varier la masse de l'espèce x par rapport à la somme des masses des espèces x et y. L'espèce z est elle reliée à l'espèce y via un coefficient constant.
Enfin il faut que je maintienne les somme des masses des trois espèces x, y et z à 515.
 
Voilà je te remercie ce programme va grandement me faciliter la vie.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Condition If...End if à l'intérieur d'une boucle For...Next

 

Sujets relatifs
[Script]en .bat pour Test FTP en boucleDébutant need Help en C
If - SwitchProblème de boucle [resolu]
Suite de pipes en boucle[VBS] passé d'une macro à ...autoit
Boucle dans un If[BATCH] creation de repertoires par parcours de fichier texte
[SHELL/UNIX] boucle 
Plus de sujets relatifs à : Condition If...End if à l'intérieur d'une boucle For...Next


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR