Sto cercando di migliorare un mia vecchia idea per sviluppare con Excel le combinazioni di una schedina Totocalcio, e questo solo per capire i meccanismi della programmazione.
Foglio “Schedina” da B1 a D15 inserisco le previsioni fissa, doppia, tripla.
Sono riuscito a calcolare il numero delle combinazioni
Sub GeneraCombinazioni()
Dim FisseRange As Range
Dim DoppieRange As Range
Dim TripleRange As Range
Dim NumFisse As Integer
Dim NumDoppie As Integer
Dim NumTriple As Integer
Dim NumCombinazioni As Long
Dim Combinazioni() As Variant
Dim i As Long
Dim j As Long
Dim k As Long
Dim m As Long
Dim n As Long
Dim cell As Range
' Imposta i range delle Fisse, Doppie e Triple
Set FisseRange = Sheets("Schedina").Range("B1:B15")
Set DoppieRange = Sheets("Schedina").Range("C1:C15")
Set TripleRange = Sheets("Schedina").Range("D1:D15")
' Calcola il numero di Fisse, Doppie e Triple
NumFisse = 0
NumDoppie = 0
NumTriple = 0
For Each cell In FisseRange
If cell.Value <> "" Then
NumFisse = NumFisse + 1
End If
Next cell
For Each cell In DoppieRange
If cell.Value <> "" Then
NumDoppie = NumDoppie + 1
End If
Next cell
For Each cell In TripleRange
If cell.Value <> "" Then
NumTriple = NumTriple + 1
End If
Next cell
NumDoppie = NumDoppie - NumTriple
NumFisse = NumFisse - NumDoppie – NumTriple
NumCombinazioni = (1 ^ NumFisse) * (2 ^ NumDoppie) * (3 ^ NumTriple)
ReDim Combinazioni(1 To NumCombinazioni, 1 To 15)
…………………………..
Adesso vorrei generare tutte le combinazioni e stamparle sul foglio “Combilazioni” partendo dalla cella A1 alla cella N1 e passando alla successiva riga per l’altra combinazione.
Esempio di sistema
1X2
1X
1X2
1
1
1
1
1
1
1
1
1
1
1
Sviluppano 18 combinazioni
1111…
1xx1…
1211…
11xx…
1x1x…
12xx…
1112…
1xx2…
1212…
11x1…
1x11…
12x1…
111x…
1xxx…
121x…
11x2…
1x12…
12x2…
Per non usare cicli annidati per ogni pronostico ho cercato di risolvere il problema come da seguente codice, ma con scarsi risultati:
' Genera tutte le combinazioni
For i = 0 To 2 ^ NumDoppie - 1
For j = 0 To 3 ^ NumTriple - 1
' Assegna i valori delle Fisse
For k = 1 To NumFisse
Combinazioni(i * 3 ^ NumTriple + j + 1, k) = FisseRange(k).Value
Next k
' Assegna i valori delle Doppie
m = i
For k = 1 To NumDoppie
If DoppieRange(k).Value <> "" And m Mod 2 = 0 Then
Combinazioni(i * 3 ^ NumTriple + j + 1, NumFisse + k) = DoppieRange(k).Value
End If
m = m \ 2
Next k
' Assegna i valori delle Triple
n = j
For k = 1 To NumTriple
If TripleRange(k).Value <> "" Then
Combinazioni(i * 3 ^ NumTriple + j + 1, NumFisse + NumDoppie + k) = TripleRange(k).Value Mod 10
If n Mod 3 = 1 Then
Combinazioni(i * 3 ^ NumTriple + j + 1, NumFisse + NumDoppie + k) = Int(TripleRange(k).Value / 10)
ElseIf n Mod 3 = 2 Then
Combinazioni(i * 3 ^ NumTriple + j + 1, NumFisse + NumDoppie + k) = TripleRange(k).Value Mod 100 \ 10
End If
End If
n = n \ 3
Next k
Next j
Next i
' Scrivi le combinazioni nel secondo foglio Excel
Sheets("Combinazioni").Range("A1:O" & NumCombinazioni).Value = Combinazioni
End sub
Chiedo consigli e suggerimenti, grazie