Patrizia Rosselli explained on 27-10-22 :
Questo è il programma: ho inserito nelle Definizioni
il numero dei giocatori (21), quello delle partite (9)
e la destinazione [Sheet1!A1].
=======================================
Public Sub RoundRobinTournament()
' Girone all'italiana
'
' Excel 2007 30-04-2009 Book1.xlsm, Module1
'
' Ogni squadra incontra una sola volta ciascuna altra squadra
' (torneo all'italiana, Round Robin Tournament).
'
' Se NumSquadre è il numero delle squadre, le partite
' saranno Cn,2 che si potranno giocare
' in NumRound sessioni di gioco (tavoli, giornate, campi, etc.)
' dove NumRound <= NumSquadre.
' Quindi, perché possano aversi lo stesso numero di partite
' per ogni Round, sarà opportuno che NumSquadre
' sia un multiplo intero di NumRound.
'
' Se NumSquadre è dispari viene onsiderato
' NumSquadre = NumSquadre + 1 e introdotto lo zero.
' Apparentemente quindi le partite risulteranno
' di NumSquadre superiori a quelle effettive, con lo
' zero che indica il turno di riposo per ogni squadra.
'
Dim i As Long, j As Long, Swap As Long
Dim TargetRange As Range, k As Long, NumRound As Integer
Dim NumSquadre As Long, D As Integer, n As Long
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
' --- Definizioni -------------
NumSquadre = 21
NumRound = 9
Set TargetRange = [Sheet1!A1]
' -----------------------------
If NumSquadre Mod 2 Then
D = 1
NumSquadre = NumSquadre + D
End If
ReDim Partite(1 To (NumSquadre * (NumSquadre - 1) / 2))
ReDim a(1 To NumSquadre) As Long
ReDim B(1 To 2, 1 To NumSquadre / 2) As Long
For i = 1 To NumSquadre
a(i) = i
If (i) <= NumSquadre / 2 Then B(1, i) = i
If (i) > NumSquadre / 2 Then _
B(2, i - NumSquadre / 2) = 1.5 * NumSquadre + 1 - i
Next
If D Then a(NumSquadre) = 0
For j = 1 To NumSquadre - 1
Swap = a(NumSquadre)
For i = NumSquadre To 3 Step -1
a(i) = a(i - 1)
Next
a(2) = Swap
For k = 1 To NumSquadre / 2
n = n + 1
Partite(n) = a(B(1, k)) & " " & a(B(2, k))
Next
Next
' Scrive NumRound colonne
k = 0: n = 0
Do
n = n + 1
For i = 1 To NumRound
k = k + 1
On Error GoTo Exit_Sub
TargetRange(n, i) = "(" & Partite(k) & ")"
Next
Loop Until k = UBound(Partite)
Exit_Sub:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
================================================
Se c'è qualcosa che non va fammelo sapere.
Bruno