ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 一指禅62

[原创] 学校体育比赛管理

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2015-12-5 10:41 | 显示全部楼层
谢谢楼主分享,很有用,收藏下来好好学习。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-5 14:58 来自手机 | 显示全部楼层
shizhishan0217 发表于 2015-12-5 00:29
您做得相当专业,设计的很强大。日后有需要我还得向您请教,多谢您的热心帮助,谢谢!

共同学习           

TA的精华主题

TA的得分主题

发表于 2015-12-5 20:33 | 显示全部楼层
看得出来"excel真的不是体育老师教的”。
相当不错,学习了。

TA的精华主题

TA的得分主题

发表于 2015-12-6 13:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

一指禅62大师你好,如果把年级增加到五个,那么需要把制表和分组模块中的: Array("七年级", "八年级", "九年级", "一年级", "二年级")数组增加数量外,还需要修改什么地方呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-6 19:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 一指禅62 于 2015-12-6 19:21 编辑
lbay 发表于 2015-12-6 13:20
一指禅62大师你好,如果把年级增加到五个,那么需要把制表和分组模块中的: Array("七年级", "八年级", " ...

共有三处:制表模块、分组模块、frm成绩登记窗体。
当初写的时候只是针对您的文件,没想到扩展。如修改为可扩展,也很容易。我再抽时间修改一下。





评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-12-6 20:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 lbay 于 2015-12-7 13:10 编辑
一指禅62 发表于 2015-12-6 19:17
共有三处:制表模块、分组模块、frm成绩登记窗体。
当初写的时候只是针对您的文件,没想到扩展。如修改 ...

一指禅62大师你好,按你说的我把制表模块、分组模块、frm成绩登记窗体三个代码中的Array数组都已经修改成为:Array("一年级", "二年级", "三年级", "四年级", "五年级")了,报名表中的班级也都修改为一至五年级了,分组表中的数据有效性也都修改为一至五年级了。还需要修改哪些呢?

校运会比赛管理(一至五年级).rar

85.5 KB, 下载次数: 119

校运会比赛管理(一至五年级).rar

85.5 KB, 下载次数: 137

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-7 20:53 来自手机 | 显示全部楼层
我现在不在电脑上,应该还要修改分组表里M列的两个数据有效性设置。我还是修改一个自适应的文件传上来,以感谢大家的关注。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-12-8 06:20 | 显示全部楼层
本帖最后由 lbay 于 2015-12-8 06:25 编辑
一指禅62 发表于 2015-12-7 20:53
我现在不在电脑上,应该还要修改分组表里M列的两个数据有效性设置。我还是修改一个自适应的文件传上来,以 ...


谢谢您,分组表里M列的两个数据有效性也设置了,但还是不能用。如果方便的话,最好把跑道的数量也能修改成6个道的,或者是6与8可选择的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-15 18:14 | 显示全部楼层
lbay 发表于 2015-12-6 13:20
一指禅62大师你好,如果把年级增加到五个,那么需要把制表和分组模块中的: Array("七年级", "八年级", " ...

整理了一个自适版,只要设置项目、规则,完成报名,其他的工作都可以一键完成。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-12-15 18:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
分组的全部代码

  1. Option Explicit
  2. Dim 年级$, 编码$, 规则$
  3. Dim rs As Object, Brr() 'Brr缓存数组
  4. Dim Itemp() '缓存组号赛道号
  5. Dim Pd%     '赛道数,用InputBox方法赋值
  6. Dim YuJin As Boolean  'True 标记为不要第一赛道

  7. Public Sub 计算机分组()
  8.     Dim i As Long, j As Integer, Msg As String
  9.     YuJin = False
  10.     If 报名状态 = False Then Exit Sub
  11.     If 接力赛人数校验 = False Then Exit Sub
  12.     If Sheet8.Range("A65536").End(3).Row > 1 Then
  13.         Msg = MsgBox("重要提示:执行分组操作后,现有的分组及成绩将被清除,相应的秩序册将作废!请慎重选择!", _
  14.             vbQuestion + vbYesNo, "比赛编组")
  15.         If Msg = vbNo Then Exit Sub
  16.     End If
  17.    
  18.     If Sheet7.Range("IV1") <> "" Then
  19.         Msg = InputBox("密码:", "比赛编组数据保护")
  20.         If StrPtr(Msg) = 0 Then Exit Sub
  21.         If Sheet7.Range("IV1") <> Msg Then MsgBox "密码错误。项目编组失败!": Exit Sub
  22.     End If

  23.     Pd = InputBox("请确定启用的跑道条数(不少于2条):", "跑道条数", 8)
  24.     If StrPtr(Pd) = 0 Then Exit Sub
  25.     If Pd < 2 Then MsgBox "跑道条数不符合系统要求,程序强制退出": Exit Sub
  26.    
  27.     Sheet8.Range("A2:H65536").ClearContents
  28.    
  29.     Msg = MsgBox("【4×100米接力】和【4×100米篮球接力】项目," & _
  30.         "在每组代表队数少于跑道数2个及以上时,可以选择不要第1道。" & _
  31.         Chr(10) + Chr(10) & "选择“是”从第2道开始编排。", vbQuestion + vbYesNo)
  32.     If Msg = vbYes Then YuJin = True
  33.    
  34.     On Error GoTo ErrExit   '未知错误
  35.     ReDim Brr(1 To 7, 1 To 1) '缓存数组
  36.     Brr(1, 1) = "姓名": Brr(2, 1) = "班级": Brr(3, 1) = "项目": Brr(4, 1) = "号码"
  37.     Brr(5, 1) = "组别": Brr(6, 1) = "赛道": Brr(7, 1) = "成绩"
  38.     Dim arr: arr = Sheet3.Range("A1").CurrentRegion
  39.     Dim S%, S1%: S = UBound(Grade) * UBound(arr)
  40.     For j = 1 To UBound(Grade)   '直接调用自定义函数(年级)
  41.         年级 = Left(Grade(j), 1)
  42.         For i = 2 To UBound(arr)
  43.             S1 = S1 + 1
  44.             编码 = arr(i, 1)
  45.             规则 = arr(i, 3)
  46.             Call 编制一个比赛组
  47.             Application.StatusBar = "进度" & Format(S1 / S * 100, "0") & "%  正在编制 " & 年级 & "年级" & arr(i, 2)
  48.         Next
  49.     Next
  50.    
  51.     Sheet8.Range("A1").Resize(UBound(Brr, 2), UBound(Brr)) = WorksheetFunction.Transpose(Brr)
  52.     Sheet8.Visible = 0
  53.     Application.StatusBar = False
  54.     Erase Brr: Erase Itemp  '清空数组
  55. 100:
  56.     Msg = InputBox("比赛编组完成。请输入数据保护密码:", "比赛编组数据保护")
  57.     If StrPtr(Msg) = 0 Then GoTo 100
  58.     Sheet7.Unprotect
  59.     Sheet7.Range("IV1") = Msg
  60.     Sheet7.Protect
  61.     Exit Sub
  62. ErrExit:
  63.     Erase Brr: Erase Itemp  '清空数组
  64.     MsgBox "出现未知错误,比赛编组失败!"
  65. End Sub

  66. Private Sub 编制一个比赛组()
  67.     Dim i As Long, j As Integer
  68.     Rem 提取参加这个比赛组的运动员
  69.     Dim SQL$, n As Long, d As Object
  70.     Set rs = CreateObject("Adodb.Recordset")
  71.     SQL = "select * from [报名表$] where 班级 like '" & 年级 & "%' and 项目编码 like '%" & 编码 & "%'"
  72.     rs.Open SQL, cnn, 1, 3
  73.     If rs.RecordCount > 0 Then
  74.         ReDim temp(1 To 2, 1 To rs.RecordCount) '数组,临时存放
  75.         For i = 0 To rs.RecordCount - 1
  76.             temp(1, i + 1) = rs!姓名
  77.             temp(2, i + 1) = rs!班级
  78.             rs.MoveNext
  79.         Next
  80.         Rem 选手无序排列
  81.         Dim crr(1 To 2), Index As Integer
  82.         For i = 1 To rs.RecordCount
  83.             Randomize
  84.             Index = Int(Rnd * rs.RecordCount) + 1
  85.             crr(1) = temp(1, i): temp(1, i) = temp(1, Index)
  86.             crr(2) = temp(2, i): temp(2, i) = temp(2, Index)
  87.             temp(1, Index) = crr(1) '姓名
  88.             temp(2, Index) = crr(2) '班级
  89.         Next
  90.         Rem 接力赛按班级随机分组
  91.         Dim k, t
  92.         If 规则 = "规则4" Then
  93.             Set d = CreateObject("Scripting.Dictionary")  '接力赛
  94.             For i = 1 To UBound(temp, 2)
  95.                 If Not d.Exists(temp(2, i)) Then
  96.                     d(temp(2, i)) = temp(1, i)
  97.                 Else
  98.                     d(temp(2, i)) = d(temp(2, i)) & "/" & temp(1, i)
  99.                 End If
  100.             Next
  101.             k = d.keys: t = d.items
  102.             ReDim temp(1 To 2, 1 To d.Count) '数组,临时存放
  103.             For i = 0 To d.Count - 1
  104.                 temp(1, i + 1) = t(i)
  105.                 temp(2, i + 1) = k(i)
  106.             Next
  107.         End If
  108.         Set d = Nothing
  109.         Rem 存放到数组
  110.         Dim S As Long: S = UBound(Brr, 2)
  111.         Dim iRow As Integer: iRow = UBound(temp, 2) ' rs.RecordCount
  112.         ReDim Preserve Brr(1 To 7, 1 To iRow + S)
  113. '        On Error Resume Next
  114.         Call 组号道号(iRow)
  115.         For i = 1 To iRow
  116.             n = S + i
  117.             Brr(1, n) = temp(1, i) '姓名
  118.             Brr(2, n) = temp(2, i) '班级
  119.             Brr(3, n) = 编码       '项目
  120.             Brr(4, n) = i          '号码
  121.             If 规则 = "规则3" Then
  122.                 Brr(5, n) = 1                    '组别
  123.                 Brr(6, n) = ((i - 1) Mod Pd) + 1 '赛道
  124.             Else
  125.                 Brr(5, n) = Itemp(1, i)  '组别
  126.                
  127.                 Brr(6, n) = Itemp(2, i)  '赛道
  128.             End If
  129.         Next
  130.     End If
  131.     rs.Close: Set rs = Nothing
  132.     Erase temp
  133. End Sub

  134. Private Sub 组号道号(iCount As Integer)
  135.     Dim i%, j%, n%, Pd1%
  136.     Dim Zs%, Ys%, a()
  137.     Pd1 = Pd
  138.     If 规则 = "规则2" Then Pd1 = Pd * 5
  139.     ReDim Itemp(1 To 2, 1 To iCount)
  140.     If iCount <= Pd1 Then
  141.         For i = 1 To iCount
  142.             Itemp(1, i) = 1 '组号
  143.             Itemp(2, i) = ((i - 1) Mod Pd) + 1 '道号
  144.         Next
  145.     Else
  146.         Zs = WorksheetFunction.RoundUp(iCount / Pd1, 0)   '组数
  147.         ReDim a(1 To Zs)    '每组人数
  148.         For i = 1 To Zs
  149.             a(i) = iCount \ Zs   '写入平均数
  150.         Next
  151.         Ys = iCount - (iCount \ Zs) * Zs  '余数
  152.         If Ys > 0 Then  '把余数从前往后依次+1
  153.             For i = 1 To Ys
  154.                 a(i) = a(i) + 1
  155.             Next
  156.         End If
  157.         For i = 1 To UBound(a)
  158.             For j = 1 To a(i)
  159.                 n = n + 1
  160.                 Itemp(1, n) = i   '组号
  161.                 Itemp(2, n) = ((j - 1) Mod Pd) + 1 '道号
  162.                 If 规则 = "规则4" Then
  163.                     If YuJin And a(i) < Pd Then
  164.                         Itemp(2, n) = ((j - 1) Mod Pd) + 2 '道号
  165.                     Else
  166.                         
  167.                     End If
  168.                 End If
  169.             Next
  170.         Next
  171.     End If
  172. End Sub

  173. Private Function 接力赛人数校验() As Boolean
  174.     接力赛人数校验 = True
  175.     Dim arr(), i%, n%, rs As Object, SQL$
  176.     Set rs = CreateObject("Adodb.Recordset")
  177.     SQL = "select 班级,Count(*) as a,'男子4×100米接力' as b from [报名表$] where 项目编码 like '%A07%' Group by 班级"
  178.     SQL = SQL & " Union all select 班级,Count(*) as a,'男子4×100米蓝球接力' as b from [报名表$] where 项目编码 like '%A08%' Group by 班级"
  179.     SQL = SQL & " Union all select 班级,Count(*) as a,'女子4×100米接力' as b from [报名表$] where 项目编码 like '%B07%' Group by 班级"
  180.     SQL = SQL & " Union all select 班级,Count(*) as a,'女子4×100米蓝球接力' as b from [报名表$] where 项目编码 like '%B08%' Group by 班级"
  181.     rs.Open SQL, cnn, 1, 3
  182.     If rs.RecordCount > 0 Then
  183.         For i = 0 To rs.RecordCount - 1
  184.             If rs!a > 0 And rs!a <> 4 Then
  185.                 n = n + 1: ReDim Preserve arr(1 To n)
  186.                 arr(n) = rs!班级 & " " & rs!B & " " & rs!a & " 名"
  187.                 接力赛人数校验 = False
  188.             End If
  189.             rs.MoveNext
  190.         Next
  191.     End If
  192.     rs.Close
  193.     Set rs = Nothing
  194.     If 接力赛人数校验 = False Then
  195.         MsgBox "接力赛人数错误,请修正报名人数!" + Chr(10) + Chr(10) + Join(arr, Chr(10)), vbExclamation, "接力赛人数校验"
  196.         frm报名管理.Show
  197.     End If
  198. End Function
复制代码

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-15 10:01 , Processed in 0.039065 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表