Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Debutant en VBA

3 réponses
Avatar
Guillaume
Bonjour

J'ai 5 valeurs dans A3 A4 A5 A6 et A6 qui sont respectivement 1 2 3 4 et 5
J'ai ecrit cette macro la (qui n'a aucun intéret que d'apprendre)

Option Explicit
Function RandomNumber(Lowest As Long, Highest As Long)
' Generates a random whole number within a given range
Randomize
RandomNumber = Int(Rnd * (Highest + 1 - Lowest)) + Lowest

End Function
Sub Comparaison()
Dim i As Integer
i = 0
Randomize

For i = 1 To 4
Label1:
Range("B3").Offset(0, i).Value = Int(Rnd * 19)
If Range("B3").Offset(0, i) = Range("A3").Value Or Range("A4").Value Or
Range("A5").Value Or Range("A6").Value Then GoTo Label1
Next

End Sub

Je pensais que la boucle tournerais tant que pour i=1 une valeur n'a pas été
touvée puis pour i=2 puis i=3 puis i=4 puis on sort de la boucle.

Or le programme fait tourner constamment des chiffres dans C3 mais ne
s'arrete jamais!!!
je ne comprend plus rien

Merci de m'aider

3 réponses

Avatar
Jac
Bonjour Guillaume,

et si tu essayais de faire ça simplement :

For i = 3 To 6
1 cells(i,2) = Int(Rnd * 19)
if cells(i,2) = cells(3,1) then goto 1
if cells(i,2) = cells(4,1) then goto 1
if cells(i,2) = cells(5,1) then goto 1
if cells(i,2) = cells(6,1) then goto 1
Next i

C'est sûr que c'est moins pro des des if imbriqués, et/ou de Or, mais
au moins c'est clair et net.

Dis-moi si ça résoud ton problème.

Jac

Guillaume a exprimé avec précision :
For i = 1 To 4
Label1:
Range("B3").Offset(0, i).Value = Int(Rnd * 19)
If Range("B3").Offset(0, i) = Range("A3").Value Or Range("A4").Value Or
Range("A5").Value Or Range("A6").Value Then GoTo Label1
Next


Avatar
Alain
Le If est mal construit et devrait plutôt ressembler a ceci:

If Range("B3").Offset(0, i) = Range("A3").Value Or _
Range("B3").Offset(0, i) = Range("A4").Value Or _
Range("B3").Offset(0, i) = Range("A5").Value Or _
Range("B3").Offset(0, i) = Range("A6").Value Then

Quoique ton code va fonctionner après avoir corriger le If l'utilisation du
GoTo est a proscrire car elle conduit à une construction mal structuré,
appelé dans le jargon "code spaghetti" et il y a toujours moyen de faire
sans...

Un exemple parmi tant d'autre de ce que ton code pourrait être sans GoTo:

Sub Comparaison()
Dim i As Integer, v As Variant
Randomize

For i = 1 To 4
Do While True
v = Int(Rnd * 19)
If v <> Range("A3").Value And v <> Range("A4").Value And _
v <> Range("A5").Value And v <> Range("A6").Value Then Exit
Do
Loop
Range("B3").Offset(0, i).Value = v
Next
End Sub


"Guillaume" wrote in message
news:#
Bonjour

J'ai 5 valeurs dans A3 A4 A5 A6 et A6 qui sont respectivement 1 2 3 4 et 5
J'ai ecrit cette macro la (qui n'a aucun intéret que d'apprendre)

Option Explicit
Function RandomNumber(Lowest As Long, Highest As Long)
' Generates a random whole number within a given range
Randomize
RandomNumber = Int(Rnd * (Highest + 1 - Lowest)) + Lowest

End Function
Sub Comparaison()
Dim i As Integer
i = 0
Randomize

For i = 1 To 4
Label1:
Range("B3").Offset(0, i).Value = Int(Rnd * 19)
If Range("B3").Offset(0, i) = Range("A3").Value Or Range("A4").Value Or
Range("A5").Value Or Range("A6").Value Then GoTo Label1
Next

End Sub

Je pensais que la boucle tournerais tant que pour i=1 une valeur n'a pas
été touvée puis pour i=2 puis i=3 puis i=4 puis on sort de la boucle.

Or le programme fait tourner constamment des chiffres dans C3 mais ne
s'arrete jamais!!!
je ne comprend plus rien

Merci de m'aider



Avatar
Nectoux Guillaume
Je vais essayer ça ce soir. Merci a tous

"Alain" a écrit dans le message de news:

Le If est mal construit et devrait plutôt ressembler a ceci:

If Range("B3").Offset(0, i) = Range("A3").Value Or _
Range("B3").Offset(0, i) = Range("A4").Value Or _
Range("B3").Offset(0, i) = Range("A5").Value Or _
Range("B3").Offset(0, i) = Range("A6").Value Then

Quoique ton code va fonctionner après avoir corriger le If l'utilisation
du GoTo est a proscrire car elle conduit à une construction mal structuré,
appelé dans le jargon "code spaghetti" et il y a toujours moyen de faire
sans...

Un exemple parmi tant d'autre de ce que ton code pourrait être sans GoTo:

Sub Comparaison()
Dim i As Integer, v As Variant
Randomize

For i = 1 To 4
Do While True
v = Int(Rnd * 19)
If v <> Range("A3").Value And v <> Range("A4").Value And _
v <> Range("A5").Value And v <> Range("A6").Value Then Exit
Do
Loop
Range("B3").Offset(0, i).Value = v
Next
End Sub


"Guillaume" wrote in message
news:#
Bonjour

J'ai 5 valeurs dans A3 A4 A5 A6 et A6 qui sont respectivement 1 2 3 4 et
5
J'ai ecrit cette macro la (qui n'a aucun intéret que d'apprendre)

Option Explicit
Function RandomNumber(Lowest As Long, Highest As Long)
' Generates a random whole number within a given range
Randomize
RandomNumber = Int(Rnd * (Highest + 1 - Lowest)) + Lowest

End Function
Sub Comparaison()
Dim i As Integer
i = 0
Randomize

For i = 1 To 4
Label1:
Range("B3").Offset(0, i).Value = Int(Rnd * 19)
If Range("B3").Offset(0, i) = Range("A3").Value Or Range("A4").Value Or
Range("A5").Value Or Range("A6").Value Then GoTo Label1
Next

End Sub

Je pensais que la boucle tournerais tant que pour i=1 une valeur n'a pas
été touvée puis pour i=2 puis i=3 puis i=4 puis on sort de la boucle.

Or le programme fait tourner constamment des chiffres dans C3 mais ne
s'arrete jamais!!!
je ne comprend plus rien

Merci de m'aider