Condividi tramite

Sviluppo e stampa combinazione valori

Anonimo
2023-05-02T19:54:36+00:00

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

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

8 risposte

Ordina per: Più utili
  1. Anonimo
    2023-05-03T11:21:50+00:00

    Ciao Michele!

    Va bene. Grazie

    Questa risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o espressioni strane.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2023-05-03T11:02:45+00:00

    se trovo una soluzione la pubblico

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2023-05-03T09:22:26+00:00

    Ciao Michele.Dilonardo!

    Mi dispiace, sfortunatamente, non ho ulteriori problemi da offrire.

    Ci sono molti utenti esperti attivi sul forum e spero che qualcun altro possa offrire ulteriori informazioni sul tuo problema.

    Cordiali saluti Shakiru ·

    Questa risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o espressioni strane.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2023-05-03T06:26:44+00:00

    Ho copiato il codice in un modulo VBA e tradotto in inglese i termini che nel codice postato sono indicati in italiano.

    La procedura si blocca (vedi commento alla riga interessata)

    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 &lt;&gt; "" Then 
    
            NumFisse = NumFisse + 1 
    
        End If 
    
    Next cell 
    
    For Each cell In DoppieRange 
    
        If cell.Value &lt;&gt; "" Then 
    
            NumDoppie = NumDoppie + 1 
    
        End If 
    
    Next cell 
    
    For Each cell In TripleRange 
    
        If cell.Value &lt;&gt; "" Then 
    
            NumTriple = NumTriple + 1 
    
        End If 
    
    Next cell 
    
    NumCombinazioni = 3 ^ NumTriple \* 2 ^ (NumDoppie - NumTriple) \* 1 ^ (NumFisse - NumDoppie - NumTriple) 
    
    ' Inizializza l'array delle combinazioni 
    
    ReDim Combinazioni(1 To NumCombinazioni, 1 To 15) 
    

    ' Genera tutte le combinazioni

    For i = 0 To 2 ^ (NumDoppie - NumTriple) - 1 
    
        For j = 0 To 3 ^ NumTriple - 1 
    
            For k = 1 To NumFisse 
    
                Combinazioni(i \* 3 ^ NumTriple + j + 1, k) = FisseRange(k).Value 
    
            Next k 
    
            For k = 1 To NumDoppie - NumTriple 
    
                If DoppieRange(k).Value &lt;&gt; "" Then 
    
                    If (i \* 2 ^ (k - 1)) &lt;&gt; 0 Then '\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 
    
                        Combinazioni(i \* 3 ^ NumTriple + j + 1, NumFisse + k) = "X" 
    
                    Else 
    
                        Combinazioni(i \* 3 ^ NumTriple + j + 1, NumFisse + k) = DoppieRange(k).Value    ' riga in errore 
    
                    End If 
    
                    End If 
    
            Next k 
    
            For k = 1 To NumTriple 
    
                If TripleRange(k).Valore &lt;&gt; "" Then 
    
                    If j Mod 3 = 0 Then 
    
                        Combinazioni(i \* 3 ^ NumTriple + j + 1, NumFisse + NumDoppie + k) = "1" 
    
                    ElseIf j Mod 3 = 1 Then 
    
                        Combinazioni(i \* 3 ^ NumTriple + j + 1, NumFisse + NumDoppie + k) = "X" 
    
                    ElseIf j Mod 3 = 2 Then 
    
                        Combinazioni(i \* 3 ^ NumTriple + j + 1, NumFisse + NumDoppie + k) = "2" 
    
                    End If 
    
            j = j \ 3 
    
                End If 
    
            Next k 
    
        Next j 
    
    Next i 
    

    ' Scrivi le combinazioni nel secondo foglio Excel

    Sheets("Combinazioni").Range("A1:O" & NumCombinazioni).Value = Combinazioni

    End Sub

    Inoltre, nel codice postato viene riportata questa istruzione Se (i E 2 ^ (k - 1)) <> 0 Allora che ho tradotto con If (i * 2 ^ (k - 1)) <> 0 Then

    Questo è tutto

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2023-05-02T20:48:46+00:00

    Ciao Michele.Dilonardo!

    Sembra che tu sia sulla strada giusta con il tuo codice. Tuttavia, vedo alcuni problemi che potrebbero causare problemi:

    * Errore di battitura: Hai un errore di battitura nei nomi delle variabili DoubleRange e NumDouble. Assicurati che corrispondano.

    * Calcolo di NumCombinations: Il calcolo di NumCombination non è corretto. Dovrebbe essere:

    NumCombination = 3 ^ NumTriple * 2 ^ (NumDouble - NumTriple) * 1 ^ (NumFixed - NumDouble - NumTriple)

    * Loop per generare combinazioni: Il tuo ciclo per generare combinazioni è vicino, ma mancano alcuni valori. Ecco una versione corretta:

    Per i = 0 A 2 ^ (NumDouble - NumTriple) - 1 Per j = 0 A 3 ^ NumTriple - 1 Per k = 1 a NumFixed Combinazioni(i * 3 ^ NumTriple + j + 1, k) = FisseRange(k). Valore Avanti k Per k = 1 A NumDouble - NumTriple Se DoubleRange(k). Valore <> "" Allora Se (i E 2 ^ (k - 1)) <> 0 Allora Combinazioni(i * 3 ^ NumTriple + j + 1, NumFixed + k) = "X" Altro Combinazioni(i * 3 ^ NumTriple + j + 1, NumFixed + k) = DoubleRange(k). Valore Fine Se Fine Se Avanti k Per k = 1 a NumTriple Se TripleRange(k). Valore <> "" Allora Se j Mod 3 = 0 allora Combinazioni(i * 3 ^ NumTriple + j + 1, NumFixed + NumDouble + k) = "1" ElseIf j Mod 3 = 1 Allora Combinazioni(i * 3 ^ NumTriple + j + 1, NumFixed + NumDouble + k) = "X" ElseIf j Mod 3 = 2 Allora Combinazioni(i * 3 ^ NumTriple + j + 1, NumFixed + NumDouble + k) = "2" Fine Se j = j \ 3 Fine Se Avanti k Avanti j Avanti i

    * Stampa di combinazioni sul foglio "Composizioni": il codice per stampare le combinazioni sul foglio "Composizioni" sembra corretto. Assicurarsi che il foglio esista e che l'intervallo A1:O" e NumCombination corrisponda al numero di righe necessarie per tutte le combinazioni.

    Gentilmente fatemi sapere, se avete bisogno di ulteriore assistenza, sarò lieto di aiutarvi ulteriormente.

    Migliori saluti Shakiru ·

    Questa risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o espressioni strane.

    La risposta è stata utile?

    0 commenti Nessun commento