[VBA Excel] Boucle infinie.

Résolu/Fermé
Goldtongue - 14 août 2010 à 15:48
 Goldtongue - 15 août 2010 à 13:09
Bonjour,

Avant tout, un aperçu du fonctionnement de la macro qui pose problème :
- elle analyse chaque cellule d'une plage de 11 cellules.
- calcule un ratio à partir d'autres informations présentes sur la même ligne.
- choisit le ratio le plus faible.
- ajoute une unité à la cellule analysée dont la ratio est le plus faible.
- ajoute une unité dans un tableau.
- affiche le tableau entier dans un msgbox.

Je pense que le problème du code qui suit se situe au niveau de la boucle DO ... WHILE.
Il semble que la condition TOTAL < CA ne soit pas respectée, et la boucle devient donc infinie.

D'après un msgbox que j'ai inséré pour vérification, les instructions dans la boucle font bien leur boulot, les résultats sont cohérents, mais elle ne s'arrête pas.

Par ailleurs, le code vaut ce qu'il vaut, mais j'ai pourtant utiliser toutes ces instructions dans d'autres macros qui, elles, marchent comme il faut.

Donc pour ceux que ça intriguera, je suis intéressé par votre diagnostique.



Option Explicit

Sub ACHAT()

Dim MIN, CA, LOYER As Long
Dim BASE, PRIX, TOTAL, RATIO As Currency
Dim LIGNE, LIGNE2, i, i2 As Byte
Dim NOMBRE As Integer
Dim NOM, strMessage As String
Dim c As Range
Dim TABLEAU(11, 2) As Variant

' REMPLISSAGE DU TABLEAU A 2 COLONNES ET 11 LIGNES

For i = 1 To 11
i2 = i + 1
TABLEAU(i, 1) = Range("A" & i2 & "").Value
TABLEAU(i, 2) = 0
Next i

' INITIALISATION DES VARIABLES

TOTAL = 0
NOM = ""
LIGNE = 20
NOMBRE = 0

CA = InputBox("De combien d'argent disposez-vous ?", "Butin")

Do While TOTAL < CA

' LES 4 PREMIÈRES LIGNES DU PREMIER TOUR DE BOUCLE NE SERVENT PAS. JE LES AI MISES ICI POUR EVITER QU'UN TOUR DE TROP DE S'INSÈRE DANS LE TABLEAU.

Range("D" & LIGNE & "").Value = NOMBRE + 1

For i = 1 To 11
If NOM = TABLEAU(i, 1) Then TABLEAU(i, 2) = TABLEAU(i, 2) + 1
Next i

MIN = 9999999

' CALCUL DU RATIO POUR CHAQUE CELLULE

For Each c In Range("D2:D12")
LIGNE2 = c.Row
BASE = Range("B" & LIGNE2 & "").Value
NOMBRE = Range("D" & LIGNE2 & "").Value
LOYER = Range("C" & LIGNE2 & "").Value
RATIO = (BASE * (1 + (NOMBRE / 10))) / LOYER
If RATIO < MIN Then MIN = RATIO: LIGNE = c.Row
Next c

NOM = Range("A" & LIGNE & "").Value
BASE = Range("B" & LIGNE & "").Value
NOMBRE = Range("D" & LIGNE & "").Value
PRIX = BASE * (1 + (NOMBRE / 10))
TOTAL = TOTAL + PRIX

Loop

strMessage = ""
For i = 1 To 11
strMessage = strMessage & TABLEAU(i, 1) & " " & TABLEAU(i, 2) & vbLf
Next i

MsgBox strMessage

End Sub
A voir également:

1 réponse

EtPafLeChien
14 août 2010 à 18:11
Bonjour,
TOTAL contient un nombre, CA est exprimé en texte

Comme ça , ça marche:

CA = Val(InputBox("De combien d'argent disposez-vous ?", "Butin"))

en espérant ne pas être arrivé trop tard
1
Merci,

C'est tout à fait ça. Ce qui m'étonne, c'est que j'ai déjà utilisé le même Inputbox erroné pour la même condition de boucle, et que ça marchait bien.

Merci beaucoup.
0