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.
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 :
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 ?
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 :
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: