Per puro esercizio ho sviluppato questo file:
http://rapidshare.com/files/1402973321/ ... z_V1-3.xlsProva a mettere i tuoi dati in Foglio1, da A2 verso il basso, poi lancia la macro CercaComb: ti verra' chiesto quale valore cercare (se inserisci un decimale devi usare il "punto" come separatore).
Il programma ha impostato un limite max delle combinazioni da testare e dei risultati positivi da restituire (che non puo' superare il numero di colonne); queste impostazioni sono nelle istruzioni marcate <<<
Non ci sono problemi a inserire un numero superiore di combinazioni, compatibilmente con la precisione di calcolo di excel e soprattutto col tempo che vorrete lasciare al pc per fare i suoi calcoli.
La macro fa un gioco di pazienza, provando le combinazioni possibii a gruppi di 1, poi di 2, poi di 3 e cosi' via fino al limite di combinazioni max impostate, e riporta nel foglio attivo (lo stesso che contiene in col A i numeri iniziali) le combinazioni man mano che si verificano. Prima di poter scrivere i risultati TUTTO IL FOGLIO viene cancellato, a parte il contenuto di colonna A.
Per futura memoria il codice e' il seguente:
- Codice: Seleziona tutto
Dim VArr, WkArr(), WkIndex(), I As Integer, J As Integer, maxCol As Long, FlExit As Boolean
Dim Kappa As Integer, WResult As String, TgVal, LastLev As Integer, NElem As Integer
Sub CercaComb()
'
maxCol = 1500 '<<< N° max di match
maxCombin = 2000000 '<<< N° max di combinazioni che saranno testate
'
If maxCol > Columns.Count Then maxCol = Columns.Count - 3
TgVal = Val(InputBox("Valore target?"))
VArr = Range(Range("A2"), Cells(Rows.Count, 1).End(xlUp))
NElem = UBound(VArr, 1)
ReDim WkArr(NElem): ReDim WkIndex(NElem)
Range("B1:IV1").Clear
Range(Range("A2"), Cells(Rows.Count, 1).End(xlUp)).Offset(-1, 1).Resize(NElem + 1, maxCol).ClearContents
'
LastLev = 3
For I = 1 To NElem
Col2h = Col2h + Evaluate("FACT(" & NElem & ")/FACT(" & I & ")/FACT(" & NElem - I & ")")
If Col2h > maxCombin Then Exit For
Gruppidi = Gruppidi & " " & I
Next I
Rispo = MsgBox("N° di combinazioni massime testate: " & Col2h - _
Evaluate("FACT(" & NElem & ")/FACT(" & I & ")/FACT(" & NElem - I & ")") & vbCrLf _
& "(Combinazione di " & NElem & " elementi a gruppi di " & Gruppidi & ")" & vbCrLf _
& "Massimo " & maxCol & " risultati" & vbCrLf & vbCrLf _
& "OK per procedere, CANCEL per annullare e modificare i parametri", vbOKCancel)
If Rispo = vbCancel Then Exit Sub
sTimer = Timer
For LastLev = 1 To I - 1
For J = 0 To NElem
WkArr(J) = "": WkIndex(J) = ""
Next J
Call Recur(1, NElem, 1)
Next LastLev
MsgBox ("Completato in " & Int(Timer - sTimer) & " Secondi" & vbCrLf _
& "Rilevati " & Cells(1, Columns.Count).End(xlToLeft).Column & " match")
End Sub
Sub Recur(ByVal Iniz As Integer, ByVal Final As Integer, ByVal myLevel As Integer)
Dim myI As Integer, myK As Integer
For myI = Iniz To Final
WkArr(myLevel) = VArr(myI, 1)
WkIndex(myLevel) = myI
If myLevel = LastLev Then
If Application.WorksheetFunction.Sum(WkArr()) = TgVal And FlExit = False Then
Cells(1, Columns.Count).End(xlToLeft).Offset(0, 1) = "x"
mycol = Cells(1, Columns.Count).End(xlToLeft).Column
If mycol > maxCol Then FlExit = True
For myK = 1 To LastLev
Cells(WkIndex(myK) + 1, mycol) = 1 'WkIndex(myK)
Next myK
End If
Else
Call Recur(myI + 1, NElem, myLevel + 1)
End If
If FlExit = True Then Exit For
Next myI
End Sub
Se siete curiosi provate anche voi.
Ciao a tutti.