如何在 Excel 中生成多场比赛(和赛车手)的时间表

问题描述 投票:0回答:1

我试图自己回答这个问题,并搜索任何相关信息,但我仍然陷入困境,不知道从哪里开始,所以希望有人可以提供帮助!

我每年为一位朋友举办几个 Scalextric 比赛之夜,理想情况下,我想要一个电子表格,可以通过一些简单的输入轻松生成当晚的比赛时间表,然后还可以用于跟踪每场比赛的分数/位置。目前,我一直在通过手动为每项赛事生成比赛时间表并跟踪分数来即时完成此操作,这显然需要时间,并且只能与生成它的人一样好(我们偶尔会遇到一些问题,有些人比其他人安排参加更多比赛或在一场比赛中获得两次名次)。我们的参赛者数量通常多于可供比赛的车道(例如,10 人参加,但一次只有 6 人可以参加比赛),因此我们需要一个公平的时间表,以确保 a) 每个人参加相同的比赛次数,b) 每个人都参加比赛每个车道。使用上面的示例,我们将进行 10 场比赛,以确保 10 个人中的每人在第 1-6 条车道上比赛一次,但这可以改变。此时间表的示例:

An example of a race schedule for 10 people

理想情况下,我正在考虑这样的功能:

  1. 输入以下信息 - 参赛者姓名(从中可以得出参赛者人数)、比赛车道数(有时我们比赛 2、4 或 6 车道)、比赛数量。
  2. 运行宏来生成比赛时间表,将上面的示例替换为矩阵,在顶部显示比赛编号,在侧面显示车道编号,并在每个位置填充名称,而不是使用如下所示的手动列表。
  3. 对于每场比赛,要么运行一个宏,要么输入一个输入来对第一/第二/第三等的车道进行评分,然后自动填充分数表,给出每个赛车手的结果。

我很高兴对第 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

此代码通过为每个比赛和车道随机生成一名赛车手来完成这项工作,然后通过检查同一行中此人的额外实例来检查该赛车手尚未参加该比赛并且之前未在该车道上比赛过和专栏。不幸的是,它在赛程快结束时陷入了无限循环,因为它到达了一个位置,没有可行的比赛可以从剩下的比赛中组合起来。

excel vba random
1个回答
0
投票

我的 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 公式来完成此操作)

enter image description here

如果只有6条泳道,则去掉表中的Lane7,8,9,10: enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.