Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !
Function Recolle(v As Range, facture As Range)
Application.Volatile
If facture.Count = 1 Then Recolle = IIf(v = facture, "x", ""): Exit Function
Dim imax&, f, u&, a$(), cible#, n&, s#, i&
imax = 100000 'nombre maximum d'itérations, à adapter
f = facture 'matrice, plus rapide
u = UBound(f)
ReDim a(1 To u, 1 To 1)
cible = v
Randomize
Do
n = n + 1
If n > imax Then End
s = 0
For i = 1 To u
a(i, 1) = ""
If Rnd > 0.5 Then a(i, 1) = "x": s = s + f(i, 1)
Next
Loop Until s = cible
Recolle = a 'vecteur vertical
End Function
(...=
je vais tester ça, et surtout essayer de comprendre le code, ce qui n'est pas gagné..
Est-il possible de commenter le code s'il fonctionne ? (...)
(...)
@Roger: j'ai testé avec des chiffres avec décimales et là, ça ne fonctionne pas...
(...)
Dim tDat, oDat(), UBoDat&, oPlg As Range, i&, j&, k&, s&, som
Dim tDat, oDat(), UBoDat&, oPlg As Range, i&, j&, k&, s#, som#
Puisque la proposition semble aller dans le bon sens, et pour perdre le minimum de temps, il serait intéressant que vous posassiez entièrement votre véritable problème.C'est du brut de fonderie qui aura vraisemblablement besoin d'un peu d'usinage, mais voyez d'abord si ça va dans le bon sens... (...)
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
Le nombre de groupement par un par un, deux par deux, trois par trois, ..., n-1 par n-1, n par n de n données est égal à 2[SUP]n[/SUP]-1, quoi qu'on en dise ici ou là.
We use cookies and similar technologies for the following purposes:
Est ce que vous acceptez les cookies et ces technologies?
We use cookies and similar technologies for the following purposes:
Est ce que vous acceptez les cookies et ces technologies?