Sub toto()
Dim oDat(), UBoDat&, oPlg As Range, i&, j&, k&, s#, som#, x
Application.ScreenUpdating = False
'__________________________________________________________________________________________
'Récupération des données.
' som Somme à atteindre.
' oDat() Récupère les données dans la colonne "Montant".
' UBoDat Nombre de lignes jusqu'à la dernière cellule non vide de la colonne "Montant".
' k Compteur de colonnes de oDat
' Data Plage nommée : voir le "Gestionnaire de noms" pour voir sa définition.
som = [O1].Value
With [Data]
Set oPlg = Range(.Cells(1, 1), .Offset(.Rows.Count, 0).End(xlUp)).Offset(1, 0)
With oPlg.Resize(oPlg.Rows.Count + (oPlg.Rows.Count > 1), 2)
oDat = .Value
.Resize([Data].Rows.Count - 1, [Data].Columns.Count).ClearContents
End With
UBoDat = UBound(oDat, 1)
k = 1: ReDim Preserve oDat(1 To UBoDat, 1 To k)
'__________________________________________________________________________________________
'Traitement des données.
'La méthode est bestiale : on va examiner les données une par une, puis les grouper deux par deux,
'trois par trois, etc., soit 2^UBoDat-1 possibilités, indexées par le compteur i.
For i = 1 To 2 ^ UBoDat - 1
'__________________________________________________________________________________________
' s initialisé à zéro, va cumuler les données. Pour i=1, s prendra la première donnée,
'pour i=2, la deuxième, pour i=3, la première et la deuxième, pour i=4, la troisième, pour i=5,
'la première et la troisième, pour i=6, la deuxième et la troisième, pour i= 7, la première,
'la deuxième et la troisième, pour i=8, la quatrième, pour i=9, la première et la quatrième, etc.
'Pour i=64, la septième, pour i=65, la première et la septième, ...
'Pour i=2^x, la x+1ième, pour i=2^x+1, la première et la x+1ième, ...
'Pour i=UBoDat-1, la somme de toute les données.
s = 0: For j = 1 To UBoDat: s = s + oDat(j, 1) * ((i \ 2 ^ (j - 1)) Mod 2): Next
'__________________________________________________________________________________________
'Si s est égal à la somme cherchée, on ajoute une colonne au tableau oDat, est on marque
'd'un"x" dans la dernière colonne tout les termes constitutifs de s.
If s = som Then
k = k + 1: ReDim Preserve oDat(1 To UBoDat, 1 To k)
For j = 1 To UBoDat
If (i \ 2 ^ (j - 1)) Mod 2 Then oDat(j, UBound(oDat, 2)) = "x"
Next
End If
Next
'__________________________________________________________________________________________
'Restitution du résultat.
.Offset(1).Resize(UBoDat, k).Value = oDat
End With
Application.ScreenUpdating = True
End Sub