ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请优化下程序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-1 20:46 | 显示全部楼层 |阅读模式
请优化下vba代码

级班科序示例.rar

90.9 KB, 下载次数: 1

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-1 20:54 | 显示全部楼层
请优化下vba代码,我把代码传来了

级班科序示例.rar

92.15 KB, 下载次数: 17

TA的精华主题

TA的得分主题

发表于 2024-5-1 22:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub test0()
  2.   
  3.   Dim results(), data
  4.   Dim i As Long, j As Long, k As Long
  5.   Dim cnt As Long, pos As Long, colSize As Long
  6.   
  7.   With Worksheets(1).Range("A1").CurrentRegion
  8.     data = Range(.Cells(1), .Offset(1)).Value
  9.   End With
  10.   ReDim results(1 To UBound(data), 1 To 100)
  11.   
  12.   pos = 1
  13.   For j = 1 To 2
  14.     results(pos, j) = data(pos, j)
  15.   Next
  16.   For colSize = j To 5
  17.     results(pos, colSize) = Split("总分 级名次 班名次")(colSize - 3)
  18.   Next
  19.   
  20.   For i = pos + 1 To UBound(data) - 1
  21.     For j = 1 To 2
  22.       results(i, j) = data(i, j)
  23.     Next
  24.     For j = 3 To UBound(data, 2)
  25.       results(i, 3) = results(i, 3) + Val(data(i, j))
  26.     Next
  27.   Next
  28.   For j = 3 To UBound(data, 2)
  29.     results(pos, colSize) = data(pos, j)
  30.     results(pos, colSize + 1) = data(pos, j) & "名次"
  31.     For i = pos + 1 To UBound(data) - 1
  32.       results(i, colSize) = data(i, j)
  33.     Next
  34.     colSize = colSize + 2
  35.   Next
  36.   colSize = colSize - 1
  37.   
  38.   For j = 6 To colSize Step 2
  39.     cnt = 1
  40.     QuickSort results, pos + 1, UBound(results) - 1, 1, colSize, j, True
  41.     results(pos + 1, j + 1) = cnt
  42.     For i = pos + 2 To UBound(results) - 1
  43.       cnt = cnt + 1
  44.       If results(i, j) < results(i - 1, j) Then results(i, j + 1) = cnt Else results(i, j + 1) = results(i - 1, j + 1)
  45.     Next
  46.   Next
  47.   
  48.   j = 3
  49.   cnt = 1
  50.   QuickSort results, pos + 1, UBound(results) - 1, 1, colSize, 3, True
  51.   results(pos + 1, j + 1) = cnt
  52.   For i = pos + 2 To UBound(results) - 1
  53.     cnt = cnt + 1
  54.     If results(i, j) < results(i - 1, j) Then results(i, j + 1) = cnt Else results(i, j + 1) = results(i - 1, j + 1)
  55.   Next
  56.   
  57.   QuickSort results, pos + 1, UBound(results) - 1, 1, colSize, 1, False
  58.   For i = 2 To UBound(results) - 1
  59.     If results(i, 1) <> results(i + 1, 1) Then
  60.       cnt = 1
  61.       QuickSort results, pos + 1, i, 1, colSize, j, True
  62.       results(pos + 1, j + 2) = cnt
  63.       For k = pos + 2 To i
  64.         cnt = cnt + 1
  65.         If results(k, j) < results(k - 1, j) Then results(k, j + 2) = cnt Else results(k, j + 2) = results(k - 1, j + 2)
  66.       Next
  67.       pos = i
  68.     End If
  69.   Next
  70.   
  71.   With Worksheets(2).Range("A1")
  72.     .CurrentRegion.Clear
  73.     With .Resize(UBound(results) - 1, colSize)
  74.       .Borders.LineStyle = xlContinuous
  75.       .HorizontalAlignment = xlCenter
  76.       .Value = results
  77.     End With
  78.   End With
  79.   
  80.   Beep
  81. End Sub

  82. Function QuickSort(ar, u As Long, d As Long, l As Long, r As Long, pos As Long, Optional IsDesc As Boolean = True)
  83.   Dim t As Long, b As Long, j As Long, x As Long, pivot, swap
  84.   t = u
  85.   b = d
  86.   pivot = ar((u + d) \ 2, pos)
  87.   While t <= b
  88.     If IsDesc Then
  89.       Do
  90.         If ar(t, pos) > pivot Then t = t + 1 Else Exit Do
  91.       Loop While t < d
  92.       Do
  93.         If ar(b, pos) < pivot Then b = b - 1 Else Exit Do
  94.       Loop While b > u
  95.     Else
  96.       Do
  97.         If ar(t, pos) < pivot Then t = t + 1 Else Exit Do
  98.       Loop While t < d
  99.       Do
  100.         If ar(b, pos) > pivot Then b = b - 1 Else Exit Do
  101.       Loop While b > u
  102.     End If
  103.     If t < b Then
  104.       For x = l To r
  105.         swap = ar(t, x): ar(t, x) = ar(b, x): ar(b, x) = swap
  106.       Next
  107.       t = t + 1: b = b - 1
  108.     Else
  109.       If t = b Then t = t + 1: b = b - 1
  110.     End If
  111.   Wend
  112.   If t < d Then QuickSort ar, t, d, l, r, pos, IsDesc
  113.   If b > u Then QuickSort ar, u, b, l, r, pos, IsDesc
  114. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-2 09:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-5-2 11:01 | 显示全部楼层
级班科序示例.zip (155.46 KB, 下载次数: 15)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-3 09:43 | 显示全部楼层
感谢各位大神的帮助,现成型我想要的了,分享给需要的朋友。

级班科序VBA.rar

96.33 KB, 下载次数: 10

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-3 10:30 | 显示全部楼层
左小光 发表于 2024-5-3 09:43
感谢各位大神的帮助,现成型我想要的了,分享给需要的朋友。

点赞         

TA的精华主题

TA的得分主题

发表于 2024-5-3 11:43 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
左小光 发表于 2024-5-3 09:43
感谢各位大神的帮助,现成型我想要的了,分享给需要的朋友。


……闲 练习……
见你好学且有所获练习新写一下仅供测试参考.zip (64.38 KB, 下载次数: 9)

TA的精华主题

TA的得分主题

发表于 2024-5-3 14:31 | 显示全部楼层
参与一下,,,
  1. Dim Brr()

  2. Sub TTT()

  3. Dim Arr, Nrr(), d As Object
  4. Dim x&, y&, R&, N&, K

  5. Set d = CreateObject("scripting.dictionary")
  6. With Sheets("原始数据样式")
  7.     R = .Cells(Rows.Count, 1).End(xlUp).Row
  8.     Arr = .Range("a1:i" & R)
  9. End With
  10. ReDim Nrr(1 To R, 1 To 19)
  11. ReDim Brr(1 To R - 1)

  12. Rem 标题列
  13. Nrr(1, 1) = Arr(1, 1)
  14. Nrr(1, 2) = Arr(1, 2)
  15. Nrr(1, 3) = "总分"
  16. Nrr(1, 4) = "级名次"
  17. Nrr(1, 5) = "班名次"
  18. For y = 3 To 9
  19.     Nrr(1, y * 2) = Arr(1, y)
  20.     Nrr(1, y * 2 + 1) = Arr(1, y) & "名次"
  21. Next y
  22. Rem 数据
  23. For x = 2 To R
  24.     Nrr(x, 1) = Arr(x, 1)
  25.     Nrr(x, 2) = Arr(x, 2)
  26.     For y = 3 To 9
  27.         Nrr(x, y * 2) = Arr(x, y)
  28.         Nrr(x, 3) = Nrr(x, 3) + Arr(x, y)
  29.     Next y
  30.     d(Nrr(x, 1)) = 1 + d(Nrr(x, 1))
  31.     Brr(x - 1) = Nrr(x, 3)
  32. Next x

  33. Rem 级排名
  34. BrrPaiXu R - 1
  35. For x = 2 To R
  36.     Nrr(x, 4) = xRnk(Nrr(x, 3) + 0)
  37. Next x
  38. Rem 班排名
  39. For Each K In d.keys
  40.     ReDim Brr(1 To d(K))
  41.     N = 0
  42.     For x = 2 To R
  43.         If Nrr(x, 1) Like K Then N = N + 1: Brr(N) = Nrr(x, 3)
  44.     Next x
  45.     BrrPaiXu N
  46.     For x = 2 To R
  47.         If Nrr(x, 1) Like K Then Nrr(x, 5) = xRnk(Nrr(x, 3) + 0)
  48.     Next x
  49. Next K
  50. Rem 各科排名
  51. For y = 6 To 18 Step 2
  52.     ReDim Brr(1 To R - 1)
  53.     N = 0
  54.     For x = 2 To R
  55.         Brr(x - 1) = Nrr(x, y)
  56.     Next x
  57.     BrrPaiXu R - 1
  58.     For x = 2 To R
  59.         Nrr(x, y + 1) = xRnk(Nrr(x, y) + 0)
  60.     Next x
  61. Next y


  62. With Sheets("处理后的数据")
  63.     .Cells.ClearContents
  64.     .[a1].Resize(R, 19) = Nrr
  65. End With

  66. End Sub

  67. Sub BrrPaiXu(M As Long)

  68. Dim a&, b&, V As Double
  69. For a = 1 To M - 1
  70. For b = 1 To M - a
  71.     If Brr(b) < Brr(b + 1) Then
  72.         V = Brr(b)
  73.         Brr(b) = Brr(b + 1)
  74.         Brr(b + 1) = V
  75.     End If
  76. Next b
  77. Next a

  78. End Sub

  79. Function xRnk(M As Double) As Long

  80. Dim a&, b&, c&
  81. a = LBound(Brr)
  82. b = UBound(Brr)
  83. Do
  84.     c = (a + b) / 2
  85.     If Brr(c) = M Then xRnk = c: Exit Do
  86.     If Brr(c) < M Then b = c - 1 Else a = c + 1
  87. Loop While a <= b

  88. End Function
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-22 17:08 , Processed in 0.043038 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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