Recherche automatique dans un tableau
Bonjour à tous,
J'ai un tableau dans lequel j'ai une colonne destination, une colonne durée et une colonne résultat. Dans la colonne résultat je voudrais faire en sorte que Excel me trouve tout seul 7 destinations dont la somme des durées est égale à 168 ou s'en rapproche le plus possible (minimum 160).
Je n'ai pas la moindre idée de comment on peut faire ça mais comme sur ce forum vous me trouvez toujours une solution je m'en remets à votre talent !
Ci-joint le fichier Excel en question
Merci pour tout.
Florentin
Bonjour ;
Voici une approche avec une macro (il faut mettre le nom de votre feuille et choisir un min et un max dans le code), elle est un peu longue il faut lui laisser 2 3 mins.
Voici le code :
' Auteur : https://www.linkedin.com/in/spilerstheo/
Sub TrouverDestinations()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("NomDeVotreFeuille") ' Modifiez avec le nom de votre feuille
Dim plageDonnees As Range
Set plageDonnees = ws.Range("A2:B31") ' Modifiez avec la plage de vos données
Const HeureCibleMin As Integer = 160
Const HeureCibleMax As Integer = 168
Dim meilleureDiff As Integer
meilleureDiff = HeureCibleMax
Dim i As Integer, j As Integer, k As Integer, l As Integer, m As Integer, n As Integer, o As Integer
Dim somme As Integer, diff As Integer
Dim resultat(1 To 7) As String, r As Integer
r = 2 ' Commencer à écrire à partir de la ligne 2 dans la colonne D
For i = 1 To plageDonnees.Rows.Count
For j = i + 1 To plageDonnees.Rows.Count
For k = j + 1 To plageDonnees.Rows.Count
For l = k + 1 To plageDonnees.Rows.Count
For m = l + 1 To plageDonnees.Rows.Count
For n = m + 1 To plageDonnees.Rows.Count
For o = n + 1 To plageDonnees.Rows.Count
somme = plageDonnees.Cells(i, 2).Value + plageDonnees.Cells(j, 2).Value + _
plageDonnees.Cells(k, 2).Value + plageDonnees.Cells(l, 2).Value + _
plageDonnees.Cells(m, 2).Value + plageDonnees.Cells(n, 2).Value + _
plageDonnees.Cells(o, 2).Value
If somme >= HeureCibleMin And somme <= HeureCibleMax Then
diff = HeureCibleMax - somme
If diff < meilleureDiff Then
meilleureDiff = diff
resultat(1) = plageDonnees.Cells(i, 1).Value
resultat(2) = plageDonnees.Cells(j, 1).Value
resultat(3) = plageDonnees.Cells(k, 1).Value
resultat(4) = plageDonnees.Cells(l, 1).Value
resultat(5) = plageDonnees.Cells(m, 1).Value
resultat(6) = plageDonnees.Cells(n, 1).Value
resultat(7) = plageDonnees.Cells(o, 1).Value
End If
End If
Next o
Next n
Next m
Next l
Next k
Next j
Next i
If meilleureDiff < HeureCibleMax Then
For Each dest In resultat
ws.Cells(r, 4).Value = dest ' Écrire chaque destination dans la colonne D
r = r + 1
Next dest
MsgBox "Destinations trouvées: " & Join(resultat, ", ") & ". Elles ont été ajoutées à la colonne D."
Else
MsgBox "Aucune combinaison valide trouvée."
End If
End SubEt le fichier :
Une approche par le solveur serait peut être envisageable et plus précise
Cordialement,
Parrish
bonjour Parrish, FloLeNulEnExcel,
avec solveur, mais j'ai raté une solution avec l'algorithme "Simplex", bizarre. (durée pour trouver une solution = aussi 40 sec)