il faut passer par un tableau à double entrée de type lettre;valeur et surtout le classer par ordre décroissant pour pouvoir décomposer la valeur facilement
ici, un exple retournant en plus le code @error à 1 si la valeur passée n'est pas entièrement décomposable :
Code : Tout sélectionner
Dim $tab_zone[6][2]=[["F",1000],["E",500],["D",200],["C",100],["B",50],["A",10]]
$zoneret=indentify_zone(1250)
$err=@error
MsgBox(0,"découpage de zone de 1250 : ",$zoneret&" erreur="&$err)
$zoneret=indentify_zone(1255)
$err=@error
MsgBox(0,"découpage de zone de 1255 : ",$zoneret&" erreur="&$err)
Func indentify_zone($val)
Local $zone=""
Local $first_ind=0
While ($val >= 10)
For $ind=$first_ind to 6
If ($tab_zone[$ind][1]<=$val) Then
$val-=$tab_zone[$ind][1]
$first_ind=$ind
$zone&=$tab_zone[$ind][0]&"+"
ExitLoop
EndIf
Next
WEnd
;on supprime le dernier "+" en fin de chaîne
$zone=StringRegExpReplace($zone,"\+\Z","")
If ($val<> 0) Then
SetError(1)
Return $zone
EndIf
SetError(0)
Return $zone
EndFunc
NB : le $firstind est une petite optimisation pour ne pas reparcourir le tableau depuis le début. En théorie on devrai mettre +1, mais si vous avez par exple comme valeur 20, alors on va faire 10, puis l'indice passe à 6, et là erreur d'index. Ceci permet de traîter les cas où une zone est déclarée 2 fois
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.