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

Condition If...End if à l'intérieur d'une boucle For...Next - VB/VBA/VBS - Programmation

Marsh Posté le 07-05-2010 à 22:42:38    

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
 

Reply

Marsh Posté le 07-05-2010 à 22:42:38   

Reply

Marsh Posté le 07-05-2010 à 23:50:27    


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.

Reply

Marsh Posté le 08-05-2010 à 11:18:45    

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

Reply

Marsh Posté le 08-05-2010 à 11:27:08    

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

Reply

Marsh Posté le 08-05-2010 à 14:28:39    

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.

Reply

Marsh Posté le 08-05-2010 à 15:56:58    

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.

Reply

Marsh Posté le 08-05-2010 à 18:11:55    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed