ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖

[求助] 帮助写代码,我想更省时些!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-2-7 19:25 | 显示全部楼层
分组、场次代码

  1. Private Function 分组模块(ByVal xCount As Integer) As Range
  2.     Select Case xCount
  3.         Case Is = 3: Set 分组模块 = Sheet1.Range("A1:BN7")
  4.         Case Is = 4: Set 分组模块 = Sheet1.Range("A9:BN17")
  5.         Case Is = 5: Set 分组模块 = Sheet1.Range("A19:BN29")
  6.         Case Is = 6: Set 分组模块 = Sheet1.Range("A31:BN43")
  7.     End Select
  8. End Function

  9. Private Function 对阵轮次规则(ByVal xCount As Integer)
  10.     Select Case xCount
  11.         Case Is = 3: 对阵轮次规则 = "23|13|12"
  12.         Case Is = 4: 对阵轮次规则 = "14,23|13,42|12,34"
  13.         Case Is = 5: 对阵轮次规则 = "25,34|15,23|14,53|13,42|12,45"
  14.         Case Is = 6: 对阵轮次规则 = "16,25,34|15,64,23|14,53,62|13,42,56|12,36,45"
  15.     End Select
  16. End Function

  17. Sub 生成比赛场次()
  18.     Dim Sh As Worksheet, Sht As Worksheet, R%
  19.     Set Sh = Sheets("运动员")
  20.     Set Sht = Sheets("竞赛分组")
  21.     R = Sh.Range("A65536").End(3).Row
  22.     If R < 4 Then MsgBox "运动员表没有报名数据!": Exit Sub
  23.     If MsgBox("执行本操作将导致现有数据丢失,请谨慎操作!" & vbCrLf & _
  24.         "选择“是”生成比赛场次,以及竞赛分组;" & vbCrLf & _
  25.         "选择“否”退出当前操作。", vbQuestion + vbYesNo, "重要提示") = vbNo Then
  26.         Exit Sub
  27.     End If
  28.     Application.DisplayAlerts = False
  29.     Application.ScreenUpdating = False
  30.    
  31.     Rem  数据整理(排序)
  32.     Sh.Sort.SortFields.Clear
  33.     Sh.Sort.SortFields.Add Range("D4:D" & R), 0, 1, 0, 0
  34.     Sh.Sort.SortFields.Add Range("E4:E" & R), 0, 1, 0, 0
  35.     With Sh.Sort
  36.         .SetRange Range("A3:F" & R)
  37.         .Header = xlYes
  38.         .MatchCase = False
  39.         .Orientation = xlTopToBottom
  40.         .SortMethod = xlPinYin
  41.         .Apply
  42.     End With
  43.    
  44.     Rem  获取分组信息
  45.     Dim arr, i%, j%, d As Object
  46.     arr = Sh.Range("A4:F" & R)
  47.     Set d = CreateObject("scripting.dictionary")
  48.     For i = 1 To UBound(arr)
  49.         If Not d.Exists(arr(i, 4)) Then
  50.             d(arr(i, 4)) = arr(i, 1)
  51.         Else
  52.             d.Item(arr(i, 4)) = d.Item(arr(i, 4)) & "|" & arr(i, 1)
  53.         End If
  54.     Next
  55.    
  56.     Rem  编排比赛场次
  57.     Dim 项目$, k, ydy, t1, t2, t3, m%, n%
  58.     Dim a(), p%    '【比赛场次】数据
  59.     Dim Rng As Range, setRng As Range
  60.     项目 = Sh.Range("B2").Text
  61.     Sht.Unprotect Password:="123"
  62.     With Sht.Range("A1:BQ2000")
  63.         .UnMerge
  64.         .Borders.LineStyle = xlNone
  65.         .Borders(xlDiagonalDown).LineStyle = xlNone
  66.         .ClearContents
  67.     End With
  68.     Set setRng = Sht.Range("A1")
  69.    
  70.     For Each k In d.keys '遍历分组
  71.         j = 0
  72.         m = 0: n = 0
  73.         ydy = Split(d.Item(k), "|")
  74.         
  75.         t1 = 对阵轮次规则(UBound(ydy) + 1)
  76.         Set Rng = 分组模块(UBound(ydy) + 1)
  77.         Rem 复制粘贴相应模块
  78.         Rng.Copy
  79.         With setRng
  80.             .PasteSpecial
  81.             .Value = 项目 & k
  82.             For j = 0 To UBound(ydy)
  83.                 .Offset(j * 2 + 1, 0).Offset(0, 1) = ydy(j)
  84.             Next
  85.         End With
  86.         
  87.         Rem  生成当前组的比赛轮次
  88.         For Each t2 In Split(t1, "|") '遍历轮次
  89.             m = m + 1
  90.             For Each t3 In Split(t2, ",") '遍历场次
  91.                 n = n + 1: p = p + 1
  92.                 Rem 【比赛场次】数据
  93.                 ReDim Preserve a(1 To 6, 1 To p)
  94.                 a(1, p) = 项目 & k          '项目与分组
  95.                 a(2, p) = "第" & m & "轮"   '轮次
  96.                 a(3, p) = n                 '场序
  97.                 a(4, p) = ydy(Mid(t3, 1, 1) - 1) '甲方
  98.                 a(5, p) = ydy(Mid(t3, 2, 1) - 1) '乙方
  99.             Next
  100.         Next
  101.         Set setRng = setRng.Offset(Rng.Rows.Count + 1, 0)   '下次粘贴位置
  102.     Next
  103.    
  104.     Rem 输出到【比赛场次】
  105.     With Sheets("比赛场次")
  106.         .Unprotect Password:="123"
  107.         .Range("A2:E1000").ClearContents
  108.         .Range("A2").Resize(p, 6) = WorksheetFunction.Transpose(a)
  109.         .Protect Password:="123"
  110.     End With
  111.     Application.ScreenUpdating = True
  112.     Application.DisplayAlerts = True
  113.     Sht.Protect Password:="123"
  114.     Set d = Nothing
  115.     Set Sh = Nothing
  116.     Set Sht = Nothing
  117.     MsgBox "OK"
  118. End Sub

复制代码




评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-2-7 19:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
成绩统计代码

  1. Public Sub 导入比赛成绩()
  2.     Dim Sh As Worksheet, R%
  3.     Dim arr, i%, x%, key$, d As Object
  4.     Set Sh = Sheets("竞赛分组")
  5.     R = Sh.Range("BN65536").End(3).Row
  6.     If R = 0 Then MsgBox "没有比赛数据!": Exit Sub
  7.    
  8.     Rem 收集比赛成绩
  9.     arr = Sh.Range("A1:BN" & R)
  10.     Set d = CreateObject("scripting.dictionary")
  11.     For i = 1 To R
  12.         If Sh.Cells(i, "BN") = "名次" Then
  13.             key = Sh.Cells(i, "A")
  14.         Else
  15.             x = Val(Sh.Cells(i, "BN"))
  16.             If x > 0 Then
  17.                 d(Sh.Cells(i, "B").Value) = key & "第" & Mid("一二三四五六", x, 1) & "名"
  18.             End If
  19.         End If
  20.     Next
  21.    
  22.     Rem  输出成绩
  23.     With Sheets("运动员")
  24.         R = .Range("A65536").End(3).Row
  25.         For i = 4 To R
  26.             If d.Exists(.Cells(i, 1).Value) Then
  27.                 .Cells(i, "F").Value = d.Item(.Cells(i, 1).Value)
  28.             Else
  29.                 .Cells(i, "F").Value = "无比赛记录"
  30.             End If
  31.         Next
  32.     End With
  33.     Set d = Nothing
  34.     Set Sh = Nothing
  35. End Sub
复制代码


TA的精华主题

TA的得分主题

发表于 2020-2-7 19:37 | 显示全部楼层
本帖最后由 一指禅62 于 2020-2-8 09:20 编辑

说明:
1、分组模版中的函数、公式全部保留,如有错误请自行修改(已检出错误);
2、撤销工作表保护密码:123
3、揣摩楼主附件及要求而作,仅供楼主参考。
4、因疫情关在家里闷得慌,聊作消遣。若不符合竞赛规则,不接受讨论。

体育比赛分组与统计.zip (454.75 KB, 下载次数: 19)



TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-8 09:36 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-2-8 09:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

附件审核中。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-22 09:11 , Processed in 0.027436 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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