ho un quesito da porvi per il quale non ho trovato ancora risposta.
Sono un amministratore di Forum dedicato a gare e campionati di Sim Racing.
Ho un file Excel con il quale assegno per ogni gara, una vettura in maniera randomica, ai piloti iscritti.
Vorrei fare in modo che non fosse possibile per i piloti ricevere una vettura che giá hanno avuto in gare precedenti.
Il numero di partecipanti é 20.
Il numero di vetture disponibili é variabile, ma nel campionato in corso é casualmente proprio 20 (sarebbe interessante una soluzione che preveda l'aumento di vetture disponibili, ma se non é possibile amen).
Il numero di gare é 6.
Al momento ho scritto una macro collegata ad un pulsante e che riporto qui sotto. Il suo "unico" problema é che non prevede ció che ho scritto sopra, ovvero potrebbe capitare che ad un pilota venga assegnata una vettura giá ricevuta per un altro Gran Premio;
- Codice: Seleziona tutto
Private Sub CmdPiloti_Click()
Dim NumMin As Long
Dim NumMax As Long
Dim colIndex As Integer
Dim rwIndex As Integer
Dim IndexPiloti As Integer
IndexPiloti = CInt(Worksheets("Piloti").Range("P1").Value)
NumMax = 12345
NumMin = 1
'Pulisci la colonna da eventuali numeri giá scritti a mano
For rwIndex = 2 To 21
For colIndex = IndexPiloti To IndexPiloti
With Worksheets("Piloti").Cells(rwIndex, colIndex)
.Cells.Value = ""
End With
Next colIndex
Next rwIndex
'Inizializza il generatore di numeri casuali.
Randomize
For rwIndex = 2 To 21
For colIndex = IndexPiloti To IndexPiloti
With Worksheets("Piloti").Cells(rwIndex, colIndex)
'genera il numero casuale
RandomRange = Int((NumMax - NumMin + 1) * Rnd + NumMin)
.Cells.Value = RandomRange
End With
Next colIndex
Next rwIndex
'Ordina la colonna dal valore piú grande al piú piccolo
Range(Cells(1, IndexPiloti - 1), Cells(21, IndexPiloti)).Select
ActiveWorkbook.Worksheets("Piloti").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Piloti").Sort.SortFields.Add Key:=Range(Cells(2, IndexPiloti), Cells(21, IndexPiloti)) _
, SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Piloti").Sort
.SetRange Range(Cells(1, IndexPiloti - 1), Cells(21, IndexPiloti))
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'Aggiorna l'index
IndexPiloti = IndexPiloti + 2
Worksheets("Piloti").Range("P1").Value = IndexPiloti
Range(Cells(1, IndexPiloti - 1), Cells(1, IndexPiloti - 1)).Select
End Sub
Allego anche screen (molto spartano perdonatemi), per fare vedere il risultato graficamente.
https://imgur.com/a/7Bp9AfH
Nella prima colonna ci sarebbero i nomi dei piloti "umani" come me (li ho oscurati io).
Le altre colonne sono le varie gare. In rosso ho evidenziato i casi che vorrei evitare.
Grazie a tutti, a disposizione per qualunque cosa.
Saluti,
Manuel