VBA ; recherche de valeurs mini sur une plage de façon dynamique

Raka

XLDnaute Occasionnel
Bonjour.

Je recrée un sujet parce que ce que je recherche là est déjà un peu trop éloigné du précédent, qui, en soi, est résolu.

Donc voici ce que j'ai :

Un problème de codage que je n'arrive pas à faire tourner en ma faveur.

Je dispose d'un tableau aux données variables selon l'implémentation d'un json.

Mon but : trouver le nombre MAXMUM de cellules dont les valeurs additionnées permettent d'arriver à une valeur entrée manuellement. Donc, trouver les valeurs les plus faibles.

Handicap : une cellule ne peut pas être sélectionnée si celle de gauche ne l'est pas avant.

Mon idée : créer un code qui va chercher les valeurs les plus faibles et non-colorées dans le tableau, regarder si chacune d'entre elle, additionnée au total des précédentes, dépasse la valeur manuelle à ne pas dépasser. Si elle ne dépasse pas, verdir la case et recommencer, sinon la rougir et fin du truc.

J'ai ce code, qui fonctionne : on entre un nombre en B2, et il cherche la plus petite valeur, colonne par colonne, et les additionne jusqu'à atteindre la valeur B2 sans la dépasser. Les cellules non-atteignables (parce que valeur donnée en B2 serait dépassée) se colorent ensuite en rouge.

VB:
Sub Bouton1_Cliquer()

Dim valeur As Integer
Dim Somme As Long

valeur = 0
Somme = Range("B2").Value

Dim i As Integer
Dim j As Integer
Dim TempSomme As Long


Min = Cells(2, 2).Value
TempSomme = 0

For j = 7 To 55
For i = 2 To 354
   If IsNumeric(Cells(i, j).Value) Then
    If Not IsNumeric(Cells(i, j - 1).Value) Or Cells(i, j - 1).Interior.Color = RGB(35, 233, 144) Then
        If Cells(i, j).Value <> 0 Then
            If Cells(i, j).Value + TempSomme < Min Then
    '           Min = Cells(i, j).Value
            TempSomme = TempSomme + Cells(i, j).Value
            Cells(i, j).Interior.Color = RGB(35, 233, 144)
            NbLvl = NbLvl + 1
            Else
             Cells(i, j).Interior.Color = RGB(231, 62, 1)
            End If
        End If
    End If
   End If
Next i
Next j

Cells(12, 2).Value = NbLvl
Cells(24, 2).Value = TempSomme

End Sub

La ligne If Not est là pour s'assurer que les valeurs à droite des valeurs rouges ne soient pas sélectionnées tout en s'assurant que la valeur la plus à gauche du tableau puisse l'être (non visible sur ce screen mais elle se trouve collée à droite d'une colonne contenant des noms, donc non numériques).

Mais du coup, je crois que ma méthode d'approche n'est pas la bonne. Le but étant de toujours sélectionner les cases contenant la valeur la plus faible, et sachant que sur une même colonne, il peut y avoir des valeurs aléatoires, je crois que je n'ai pas pris le bon chemin... En effet :

1595762163197.png

La macro choisit la case à 4.000 avant de choisir celles à 2000, ce qui n'est pas bon du tout.

Plutôt que de passer le tableau ligne par ligne, colonne par colonne comme je l'ai fait, n'existe-t-il pas un moyen simple de faire un parcours d'arbre ? Ou si c'est trop compliqué en VBA, faire en sorte que la macro parcoure le tableau de la sorte :

Il faudrait que je trouve un moyen de remplacer "regarder colonne" par "regarder la valeur numérique non-colorée le plus à gauche de chaque ligne." Dans la plage couverte par i:j bien sûr.

Cette méthode aurait le mérite de comparer les cellules 2000 avec la cellule 4000, toutes trois "les plus à gauche", et de colorer les 2000 avant la 4000, logique que je cherche.

Pour donner un exemple concret :

Dans le tableau ci-dessus, la première occurrence de la recherche (sur tableau totalement blanc donc) devrait comparer les valeurs 3000, 80, 2000 et 4000. Elle va donc colorer 80, puis comparer les valeurs 3000, 120, 2000 et 4000. Colorer 120, etc...

Est-ce simple à faire ?
 
Dernière édition:

Statistiques des forums

Discussions
313 198
Messages
2 096 131
Membres
106 503
dernier inscrit
bro3886