|
在Excel工作表中,比如现有参加初中男子100米运动员18人,女子100米运动员13人(见附件)。
编排方法:
1.先根据运动员的参赛人数和提供的跑道数,确定组数(因为各学校的跑道条数不一样);
2.同一单位的不能分在一组(除非参赛人数少,没有办法避开),各组中的人数应尽量相等;
3.运动员在组内的顺序随机产生。确定道次号时,若该组运动员刚好是跑道数(8条),就从1道开始排;若不足跑道数,不排的道次号顺序依次为1、8、2、7;若跑道数为6条,不排道次号顺序依次为1、6、2。
4.最后根据各项目生成附件中的样式。若没有办法各项目全部编排出来的话,也可以各项目分开编排,每项目参赛人数可控制在50人范围。
请各位大侠们给予帮助编一个VBA程序为谢。
你的算法不错,按你思路弄了一个。 - Sub grf()
- pds = Sheet2.[I1] '跑道数
- With Sheet1
- arr = .Range("a1:f" & .[a65536].End(3).Row)
- org = arr
- Set d1 = CreateObject("scripting.dictionary")
- Set d2 = CreateObject("scripting.dictionary")
-
- For i = 2 To UBound(arr) '参加各项目的人数,行号
- d1(arr(i, 4)) = d1(arr(i, 4)) & "," & i
- Next
-
- For Each xm In d1.keys '对于每个项目
- xrr = Split(d1(xm), ",") '各项目的行号
- rs = UBound(xrr) '第1步:统计项目人数
- zs = Int((rs - 0.001) / pds) + 1 ' 第2步:确定组次
- For k = 1 To UBound(xrr) '第3步:对项目进行分组
- i = xrr(k)
- n = n + 1
- If n > zs Then n = 1
- arr(i, 5) = xm & n
- arr(i, 6) = Rnd '随机数辅助列,用于乱序
- Next
- Next
- .Range("a1:f" & .[a65536].End(3).Row) = arr
- .Range("a2:f" & .[a65536].End(3).Row).Sort key1:=.[e2], key2:=.[f2] '第4步:在各组内对运动员进行顺机排序
- arr = .Range("a1:f" & .[a65536].End(3).Row)
- .Range("a1:f" & .[a65536].End(3).Row) = org '恢复原序
- For i = 2 To UBound(arr)
- d2(arr(i, 5)) = d2(arr(i, 5)) & "," & i '每组人所在行
- Next
- End With
-
- With Sheet2 '第5步:确定道次
- .[a2].Resize(10000, 6).Clear
- For Each zu In d2.keys '对于每个组
- xrr = Split(d2(zu), ",")
- bzrs = UBound(xrr) '本组人数
- ReDim brr(1 To pds, 1 To 6)
- qs = Int((pds - bzrs + 1) / 2) + 1 '起始跑道
- n = 0
- For k = 1 To pds
- brr(k, 1) = Right(zu, 1)
- brr(k, 2) = k
- If k >= qs Then
- n = n + 1
- If n <= bzrs Then
- i = xrr(n)
- For j = 1 To 4: brr(k, j + 2) = arr(i, j): Next
- End If
- End If
- Next
- r = .[a65536].End(3).Row + 1
- .Cells(r, 1).Resize(pds, 6) = brr '显示本项目安排结果
- Next
- r = .[a65536].End(3).Row + 1 '加空格
- For i = r To 3 Step -1
- If .Cells(i, 1) <> .Cells(i - 1, 1) Then .Rows(i).Insert
- Next
- End With
- End Sub
复制代码
|
|