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
15 août 2010 à 13:09
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.