Sub Croisement21()
Dim Longueur#, L(), M&(1 To 10), L0#, nb&, i&
Dim i1&, i2&, i3&, i4&, i5&, i6&, i7&, i8&, i9&, i10&
Const k& = 10
Rem Au choix, ces deux lignes :
Rem =============================================================================
' Longueur = 12000
' L = Array(Empty, 3935, 2150, 1018, 3615, 3500, 1597, 3666, 3175, 2894, 3828)
Rem =============================================================================
Rem ou ces quatre lignes :
Rem =============================================================================
With Worksheets("Données")
Longueur = .Range("C2").Value
L = WorksheetFunction.Transpose(.Range("C3").Resize(k).Value)
End With
Rem =============================================================================
With Worksheets("Combinaisons").Range("A1").Resize(1, k + 2)
Intersect(.CurrentRegion.Offset(1), .Parent.Columns(1).Resize(, k + 2)).ClearContents
L0 = Longueur
For i = 1 To k
If L(i) > 0 Then M(i) = Longueur \ L(i): If L(i) < L0 Then L0 = L(i)
Next
For i1 = 0 To M(1): Longueur = Longueur + L(1) * (i1 > 0): If Longueur < 0 Then i1 = i1 + 1: Exit For
For i2 = 0 To M(2): Longueur = Longueur + L(2) * (i2 > 0): If Longueur < 0 Then i2 = i2 + 1: Exit For
For i3 = 0 To M(3): Longueur = Longueur + L(3) * (i3 > 0): If Longueur < 0 Then i3 = i3 + 1: Exit For
For i4 = 0 To M(4): Longueur = Longueur + L(4) * (i4 > 0): If Longueur < 0 Then i4 = i4 + 1: Exit For
For i5 = 0 To M(5): Longueur = Longueur + L(5) * (i5 > 0): If Longueur < 0 Then i5 = i5 + 1: Exit For
For i6 = 0 To M(6): Longueur = Longueur + L(6) * (i6 > 0): If Longueur < 0 Then i6 = i6 + 1: Exit For
For i7 = 0 To M(7): Longueur = Longueur + L(7) * (i7 > 0): If Longueur < 0 Then i7 = i7 + 1: Exit For
For i8 = 0 To M(8): Longueur = Longueur + L(8) * (i8 > 0): If Longueur < 0 Then i8 = i8 + 1: Exit For
For i9 = 0 To M(9): Longueur = Longueur + L(9) * (i9 > 0): If Longueur < 0 Then i9 = i9 + 1: Exit For
For i10 = 0 To M(10): Longueur = Longueur + L(10) * (i10 > 0)
If Longueur < 0 Then
i10 = i10 + 1: Exit For
ElseIf Longueur < L0 Then
nb = nb + 1
.Offset(nb) = Array(i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, Longueur, i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10)
DoEvents
End If
Next: Longueur = Longueur + L(10) * (i10 - 1)
Next: Longueur = Longueur + L(9) * (i9 - 1)
Next: Longueur = Longueur + L(8) * (i8 - 1)
Next: Longueur = Longueur + L(7) * (i7 - 1)
Next: Longueur = Longueur + L(6) * (i6 - 1)
Next: Longueur = Longueur + L(5) * (i5 - 1)
Next: Longueur = Longueur + L(4) * (i4 - 1)
Next: Longueur = Longueur + L(3) * (i3 - 1)
Next: Longueur = Longueur + L(2) * (i2 - 1)
Next
End With
End Sub