Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

macro excel per "rotazione" giocatori

585 views
Skip to first unread message

Giulio

unread,
Oct 10, 2013, 7:02:44 AM10/10/13
to
Perdonatemi, mi chiedevo se può essere creata una macro di excel per risolvere questo problema:

molto semplicemente: ci sono 6 giocatori di tennis, che devono ruotare periodicamente su un campo da tennis (4 giocatori per volta) per un determinato numero di giornate (supponiamo 20 giornate).
Il risultato deve essere che ogni volta vi sono 4 che giocano e 2 che stanno fuori, e alla fine delle giornate devono avere giocato tutti e 6 lo stesso numero di partite, alternandosi a turno.

Le condizioni che vorrei applicare sono due:
- che il turno successivo giochino tutti i giocatori che nel turno prima erano stati a riposo,
- e che non vi siano coppie fisse, ma random che variano di volta in volta.

secondo voi si può creare?

r

unread,
Oct 10, 2013, 6:53:42 PM10/10/13
to
penso che sia abbastanza semplice, partendo dalle disposizioni senza ripetizioni applicare la prima regola ... la seconda è senza molto senso e comunque facile da realizzare in un secondo momento ... quindi puoi partire da qui k=4 n=6:
https://sites.google.com/site/e90e50fx/home/disposizioni-semplici-senza-ripetizioni

saluti
r


r

unread,
Oct 11, 2013, 11:40:36 AM10/11/13
to
ci ho ripensato un po' ... qui:
https://sites.google.com/site/e90e50/scambio-file/rotazione_giocatori.xls

il file per una soluzione con formule ...
è riservata al caso di n+2 giocatori dove il 2 indichi che devono essere sempre e solo 2 i giocatori esclusi, n può essere variato basta aggiungere nuovi valori in colonna A.

Si può fare una versione completamente dinamica con la stessa logica (penso) ... beh se a qualcuno dovesse servire naturalmente :-)

saluti
r

Giulio

unread,
Oct 12, 2013, 3:59:22 AM10/12/13
to
Il giorno venerdì 11 ottobre 2013 17:40:36 UTC+2, r ha scritto:
>
> Si può fare una versione completamente dinamica con la stessa logica (penso) ... beh se a qualcuno dovesse servire naturalmente :-)
>
>


grazie mille!! è un file utilissimo.
Cosa intendi per "versione completamente dinamica"?
Infatti mi chiedevo se c'è una logica nell'alternanza dei giocatori, o se sono presi semplicemente random.
Questo perchè noto che alcuni ricorrono anche 5 volte consecutivamente, mentre sarebbe utile (ma forse chiedo troppo...) una condizione che non vi siano ripetizioni superiori a 3 consecutive.
cmq grazie davvero

r

unread,
Oct 12, 2013, 9:02:02 AM10/12/13
to
ummmm sfida sempre più interessante!

la casualità è introdotta sia sulla riga che sulla colonna ... nel primo file partivo dalle combinazioni di classe 2 su n oggetti.
Trovate le combinazioni (prime due colonne (supporto colonne B:C) si andava a scegliere la prima combinazione successiva che rispettasse la condizione in cui tutti e due gli oggetti erano diversi dai 2 precedenti.
Quindi la prima modifica sta nel rendere questa scelta casuale tra la prima e le n possibili combinazioni ... uso casuale.tra per semplicità ma potremo adattare per chi usa il 2003 senza strumenti di analisi ... ci vorrebbe però una colonna di supporto in più a causa di un diverso comportamento tra casuale.tra e casuale nelle formule di matrice.
La formula che restituisce una matrice di due elementi è da inserire in una cella poi dopo aver selezionato anche la cella alla sua destra (D1:E1) va confermata con ctrl+maiusc+invio:
=INDICE(B2:C100;PICCOLO(SE(MATR.PRODOTTO(CONTA.SE(D1:E1;B2:C100);{1.1})=0;RIF.RIGA(B2:C100)-MIN(RIF.RIGA(B2:C100))+1);CASUALE.TRA(1;COMBINAZIONE(RIGHE(rng);2)));0)
va poi trascinata in basso.

Il secondo grado di casualità che ho introdotto è nella posizione dei giocatori nelle colonne. Prima venivano sempre ordinati nel senso della loro posizione iniziale.

In E1:
=INDICE(rng;PICCOLO(SE(1-CONTA.SE($D2:E2;rng);RIF.RIGA(SCARTO($A$1;;;RIGHE(rng))));
INT(CASUALE()*(RIGHE(rng)-CONTA.VALORI($D2:E2)))+1))

da confermare con ctrl+maiusc+invio e trascinare a destra e in basso.

qui c'è il file:
http://goo.gl/4zFUvf

saluti
r



Bruno Campanini

unread,
Oct 13, 2013, 8:50:01 AM10/13/13
to
After serious thinking Giulio wrote :
Le coppie sono 15 (combinazioni semplici di 6 giocatori
presi due a due C6,2 = 15):
12 23 34 45 56
13 24 35 46
14 25 36
15 26
16
Ciascun giocatore vi appare 5 volte.

Il risultato dovrebbe essere questo:
------------------------------------------
1 2 3 4 1 3 2 4 1 4 2 3
1 2 5 6 1 5 2 6 1 6 2 5
3 4 5 6 3 5 4 6 3 6 4 5
1 3 2 4 1 2 3 4 1 4 3 2
1 3 5 6 1 5 3 6 1 6 3 5
2 4 5 6 2 5 4 6 2 6 4 5
1 4 2 3 1 2 4 3 1 3 4 2
1 4 5 6 1 5 4 6 1 6 4 5
2 3 5 6 2 5 3 6 2 6 3 5
1 5 2 3 1 2 5 3 1 3 5 2
1 5 4 6 1 4 5 6 1 6 5 4
2 3 4 6 2 4 3 6 2 6 3 4
1 5 2 3 1 2 5 3 1 3 5 2
1 5 4 6 1 4 5 6 1 6 5 4
2 3 4 6 2 4 3 6 2 6 3 4
1 6 2 3 1 2 6 3 1 3 6 2
1 6 4 5 1 4 6 5 1 5 6 4
2 3 4 5 2 4 3 5 2 5 3 4

54 partite coi 6 giocatori che scendono in campo
36 volte ciascuno (36 x 6 = 216; 216/4 = 54).

Il rispetto della prima condizione è ottenuto seguendo l'ordine:
dalla prima partita della prima colonna a scendere fino alla
18° sempre della prima colonna; dalla prima della seconda colonna
a scendere, etc.

Se il risultato è corretto e si volesse considerare variabile
il numero dei giocatori, si può anche mettere mano al codice VBA.

Bruno


Bruno Campanini

unread,
Oct 14, 2013, 7:01:37 AM10/14/13
to
It happens that Bruno Campanini formulated :

> Le coppie sono 15 (combinazioni semplici di 6 giocatori
> presi due a due C6,2 = 15):
> 12 23 34 45 56
> 13 24 35 46
> 14 25 36
> 15 26
> 16
> Ciascun giocatore vi appare 5 volte.
[...]

M'è scappato un doppione.

La tabella va corretta come segue:
======================================================

Il risultato dovrebbe essere questo:
------------------------------------------
1 2 3 4 1 3 2 4 1 4 2 3
1 2 5 6 1 5 2 6 1 6 2 5
3 4 5 6 3 5 4 6 3 6 4 5
1 3 2 4 1 2 3 4 1 4 3 2
1 3 5 6 1 5 3 6 1 6 3 5
2 4 5 6 2 5 4 6 2 6 4 5
1 4 2 3 1 2 4 3 1 3 4 2
1 4 5 6 1 5 4 6 1 6 4 5
2 3 5 6 2 5 3 6 2 6 3 5
1 5 2 3 1 2 5 3 1 3 5 2
1 5 4 6 1 4 5 6 1 6 5 4
2 3 4 6 2 4 3 6 2 6 3 4
1 6 2 3 1 2 6 3 1 3 6 2
1 6 4 5 1 4 6 5 1 5 6 4
2 3 4 5 2 4 3 5 2 5 3 4

51 partite coi 6 giocatori che scendono in campo
34 volte ciascuno (34 x 6 = 204; 204/4 = 51).

Bruno


Patrizia Rosselli

unread,
Oct 27, 2022, 5:09:42 PM10/27/22
to
Vabbè voi siete dei geni. Io non ci capisco nulla ma ho un problema. Ho 21 giocatori e 9 partite, e vorrei avere una rotazione su questi 21 sapendo che al massimo ne posso convocare 17 ad ogni partita. Vorrei fare in modo che giochino tutti più o meno lo stesso numero di partite. Riuscite ad aiutarmi? Grazie mille ciao bravi
Patrizia

Andrea.9

unread,
Oct 27, 2022, 7:21:40 PM10/27/22
to
più facile fare a mano che con Excel.
purtroppo con i tuoi numeri (21, 17, 9) non puoi ottenere un bilanciamento esatto tra tutti i giocatori
ipotizzando che i 21 giocatori si identifichino con i numeri da 1 a 21, basta "saltarne" gruppi di 4 giocatori a rotazione in ogni partita.

diventa:
////5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21
1/2/3/4/////9/10/11/12/13/14/15/16/17/18/19/20/21
1/2/3/4/5/6/7/8/////13/14/15/16/17/18/19/20/21
1/2/3/4/5/6/7/8/9/10/11/12/////17/18/19/20/21
1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16//////21
///4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/
1/2/3/////8/9/10/11/12/13/14/15/16/17/18/19/20/21
1/2/3/4/5/6/7/////12/13/14/15/16/17/18/19/20/21
1/2/3/4/5/6/7/8/9/10/11/////16/17/18/19/20/21

cioè non giocano:
1/2/3/4
5/6/7/8
9/10/11/12
13/14/15/16
17/18/19/20
21/1/2/3
4/5/6/7
8/9/10/11
12/13/14/15

come vedi i giocatori da 1 a 15 saltano due partite, mentre i giocatori da 16 a 21 saltano una partita.
dovrai poi gestire gli assenti
Andrea

Bruno Campanini

unread,
Oct 29, 2022, 12:58:44 PM10/29/22
to
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
0 new messages