ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 名次顺位排序法

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-8 21:58 | 显示全部楼层
单项计算.rar (13.72 KB, 下载次数: 9) ,老师,您好,我把正确的结果通过手工计算出来,表中红色部分,不知能否在生成结果时生成红色部分数据,谢谢!感谢您不厌其烦的帮助!

TA的精华主题

TA的得分主题

发表于 2014-8-8 23:10 | 显示全部楼层
本帖最后由 香川群子 于 2014-8-8 23:54 编辑

经确认,按规则计算结果是正确的,排序也没错……但最后输出结果时发生了错误。

现在代码已经修改完成了。

附件更新、上代码:
  1. Function rk(Rng As Range, Optional n& = 0) '对整个区域计算后得到最终名次
  2.     '参数1: Rng=全部数据区域
  3.     '可选参数2: 默认n=0时按多行单列数组区域输出(使用数组三键)、n>0时输出指定序号对应的名次结果
  4.     Dim i&, j&, m&, r&, s$, t&
  5.    
  6.     m = Rng.Rows.Count '读取区域总行数m 即选手人数 或每一个裁判可给出的最大分值
  7.     ReDim x(1 To m, 1 To 2) '定义m行2列的数组 用来排序
  8.     ReDim y(1 To m, 1 To 1) '定义m行1列的数组 输出排序结果
  9.     For i = 1 To m
  10.         x(i, 1) = f(Application.Index(Rng.Value, i), m, 1) '第1列用自定义函数f计算排序结果值
  11.         x(i, 2) = i '第2列写入序号
  12.     Next
  13.    
  14.     '下面是香川改进冒泡算法排序
  15.     For i = 1 To m
  16.         s = x(i, 1): t = x(i, 2)
  17.         For j = i + 1 To m
  18.             If x(j, 1) < s Then s = x(j, 1): t = x(j, 2): r = j
  19.         Next
  20.         
  21.         If r Then
  22.             x(r, 1) = x(i, 1): x(i, 1) = s
  23.             x(r, 2) = x(i, 2): x(i, 2) = t
  24.             r = 0
  25.         End If
  26.     Next
  27.     '排序完成后 重新整理得到正确的名次结果
  28.     For i = 1 To m
  29.         y(x(i, 2), 1) = i
  30.     Next
  31.     If n Then rk = y(n, 1) Else rk = y '默认n=0时按多行单列数组区域输出二维数组结果、n>0时输出指定序号的名次
  32.     '指定n值时、计算效率低一些但使用方便 但注意Rng区域须绝对引用。
  33.     '而按数组三键公式使用时计算效率高
  34. End Function
  35. Function f(r, m&, Optional k& = 0) '仅计算某一行的数据 按规则得到排序结果值
  36.     '参数1: r=单行数据区域
  37.     '参数2: m为本组总人数、或最大分值
  38.     '可选参数3: 默认k=0时 计算工作表区域中的行 k=1时计算VBA内存一维数组
  39.     Dim h$, i&, l&, l2&, n&, n2&, t&, s$, ss$
  40.    
  41.     l = Len(CStr(m)): s = String(l - 1, "0") '计算最大分值的位数
  42.     If k = 0 Then n = r.Count Else n = UBound(r) '获取本行列数 即裁判人数n
  43.     n2 = (n + 1) / 2: l2 = Len(CStr(m * n2)) '计算过半数n2、以及过半时的总位数
  44.    
  45.     ReDim a(1 To m): ReDim b(1 To m) '数组a记录本行得分次数、顺序,数组b记录分值总和的表达式
  46.     For i = 1 To n
  47.         t = r(i): a(t) = a(t) & Right(s & t, l): b(t) = b(t) & "+" & Right(s & t, l)
  48.     Next
  49.     ss = Join(a, "") '得到排序后的全部分值ss
  50.     h = Right(String(l2 - 1, "0") & Application.Evaluate(Left(Join(b, ""), n2 * (l + 1))), l2) '计算过半时的分值总和h
  51.     f = "s" & Mid(ss, (n2 - 1) * l + 1, l) & "_" & Mid(ss, n2 * l + 1, l) & "h" & h & "s" & Mid(ss, (n2 + 1) * l) & "f" & Right(s & r(1), l) & "_" & ss
  52.     '输出按6种规则及顺序计算后的排序结果值:s[过半时分值档]_[过半+1分值]h[过半总和]s[过半+1以后分值顺序]f[第1裁判给分]_[排序后的全部分值]
  53. End Function
复制代码
单项计算.rar (15.3 KB, 下载次数: 33)


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-9 15:21 | 显示全部楼层
本帖最后由 EXCEL江湖 于 2014-8-9 15:23 编辑

香川群子老师,感谢您的大力帮忙,目前测试结果都是对的。再次感谢!感谢您对代码的细心注释。
在实际运用中,红色的部分要全部生成出来,在输出结果上最好能够把一页中的几个项目一次性全部生成出来,可能也是要用的数组,还请老师多帮忙!

TA的精华主题

TA的得分主题

发表于 2014-8-9 15:49 | 显示全部楼层
EXCEL江湖 发表于 2014-8-9 15:21
香川群子老师,感谢您的大力帮忙,目前测试结果都是对的。再次感谢!感谢您对代码的细心注释。
在实际运用 ...

如果数据表格格式规范化,可以使用事件过程来自动完成计算、输出名次结果。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-9 21:41 | 显示全部楼层
香川群子老师,您好!我做了一个规范数据的表,并对数据出现形式做了说明,希望生成sheet2里的结果,您帮忙看下,谢谢您在百忙中帮助我! 单项计算 VB.rar (17.95 KB, 下载次数: 7)

TA的精华主题

TA的得分主题

发表于 2014-8-10 09:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2014-8-8 23:10
经确认,按规则计算结果是正确的,排序也没错……但最后输出结果时发生了错误。

现在代码已经修改完成了 ...

香川群子老师!高高高手!

TA的精华主题

TA的得分主题

发表于 2014-8-10 13:59 | 显示全部楼层
数据格式要求:

1. 数据固定从A5开始 (B7为首行有效分值) 这一条必须遵守!
2. 所有项目数据格式相同:
   A列背番号、B列开始为裁判给出分值(列数不限)
3. 所有项目数据之间连续排列,中间没有空行。
   (B列有效分值间隔2行)
4.【注意不能使用合并单元格】

点击按钮即在数据区域隔开一列开始写入名次和排序结果。

单项计算 VB.rar

18.75 KB, 下载次数: 25

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-10 16:07 | 显示全部楼层
感谢香川群子老师的帮助!计算的结果很准确!
在实际工作中,要得到其计算的过程,就如15楼中的sheet2,还请老师您帮忙!万分感谢!

TA的精华主题

TA的得分主题

发表于 2014-8-10 17:22 | 显示全部楼层
有了正确的名次结果,以及按照规则计算得到的排序结果,过程就不需要了。

…………
不好意思,你自己想办法吧。
因为我没有兴趣去做这个事。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-10 21:04 | 显示全部楼层
谢谢香川群子多次帮助,我也要加强学习,争取也能象您一样帮助更多的人!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-9-19 08:16 , Processed in 0.044423 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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