我试图自己回答这个问题,并搜索任何相关信息,但我仍然陷入困境,不知道从哪里开始,所以希望有人可以提供帮助!
我每年为一位朋友举办几个 Scalextric 比赛之夜,理想情况下,我想要一个电子表格,可以通过一些简单的输入轻松生成当晚的比赛时间表,然后还可以用于跟踪每场比赛的分数/位置。目前,我一直在通过手动为每项赛事生成比赛时间表并跟踪分数来即时完成此操作,这显然需要时间,并且只能与生成它的人一样好(我们偶尔会遇到一些问题,有些人比其他人安排参加更多比赛或在一场比赛中获得两次名次)。我们的参赛者数量通常多于可供比赛的车道(例如,10 人参加,但一次只有 6 人可以参加比赛),因此我们需要一个公平的时间表,以确保 a) 每个人参加相同的比赛次数,b) 每个人都参加比赛每个车道。使用上面的示例,我们将进行 10 场比赛,以确保 10 个人中的每人在第 1-6 条车道上比赛一次,但这可以改变。此时间表的示例:
理想情况下,我正在考虑这样的功能:
我很高兴对第 1 点和第 3 点进行编码,但我不知道如何处理第 2 点 - 目前我取得的最好成绩是从列表中随机挑选姓名并将其中的 6 个姓名放入一列中 10 次但没有错误检查每个人被选中的次数等。
编辑:抱歉没有将我的研究包含在原始帖子中 - 我一直在花时间尝试解决这个问题,并且我已经达到了以下代码:
Private Sub schedule()
last_row = Sheets("Info").Range("D1").End(xlDown).Row
Dim racerslist()
Dim index As Integer
Dim racer As String
Dim nolanes As Integer
Dim srch1 As Range
Dim srch2 As Range
Dim cel As Range
nolanes = Sheets("Info").Cells(2, 2).Value
ReDim racerslist(last_row - 2, 0)
For i = 0 To last_row - 2
racerslist(i, 0) = Sheets("Info").Range("D" & i + 2)
Next
Sheets("Schedule").Select
For i = 1 To last_row - 1
For j = 1 To nolanes
index = Int((last_row - 1) * Rnd)
racer = racerslist(index, 0)
Set srch1 = Range(Cells(2, i + 2), Cells(j, i + 2))
For Each cel In srch1
If InStr(1, cel.Value, racer) > 0 Then
setfound = 1
End If
Next
Set srch2 = Range(Cells(j + 1, 3), (Cells(j + 1, i + 2)))
For Each cel In srch2
If InStr(1, cel.Value, racer) > 0 Then
setfound = 1
End If
Next
If setfound = 1 Then
j = j - 1
setfound = 0
Else
Cells(j + 1, i + 2).Value = racer
End If
Next
Next
End Sub
此代码通过为每个比赛和车道随机生成一名赛车手来完成这项工作,然后通过检查同一行中此人的额外实例来检查该赛车手尚未参加该比赛并且之前未在该车道上比赛过和专栏。不幸的是,它在赛程快结束时陷入了无限循环,因为它到达了一个位置,没有可行的比赛可以从剩下的比赛中组合起来。
我的 VBA 技能很差,但我认为你可以这样做:
首先,写出 10 场比赛、10 个泳道的表格,如下所示(该表格是从在线 Sokudo 游戏之一复制的)
R 我 | R 2 | R 3 | R 4 | R 5 | R 6 | R 7 | R 8 | R 9 | R 10 | |
---|---|---|---|---|---|---|---|---|---|---|
姓名1 | L1 | L2 | L3 | L4 | L5 | L6 | L7 | L8 | L9 | L10 |
姓名2 | L10 | L1 | L2 | L3 | L4 | L5 | L6 | L7 | L8 | L9 |
姓名3 | L9 | L10 | L1 | L2 | L3 | L4 | L5 | L6 | L7 | L8 |
姓名4 | L8 | L9 | L10 | L1 | L2 | L3 | L4 | L5 | L6 | L7 |
姓名5 | L7 | L8 | L9 | L10 | L1 | L2 | L3 | L4 | L5 | L6 |
姓名6 | L6 | L7 | L8 | L9 | L10 | L1 | L2 | L3 | L4 | L5 |
姓名7 | L5 | L6 | L7 | L8 | L9 | L10 | L1 | L2 | L3 | L4 |
姓名8 | L4 | L5 | L6 | L7 | L8 | L9 | L10 | L1 | L2 | L3 |
姓名9 | L3 | L4 | L5 | L6 | L7 | L8 | L9 | L10 | L1 | L2 |
姓名10 | L2 | L3 | L4 | L5 | L6 | L7 | L8 | L9 | L10 | L1 |
如果只有4条车道,则删除表中的Lane5,6,7,8,9,10:
(如果您不想编写代码,可以使用条件格式或一些简单的 Excel 公式来完成此操作)