ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用vba求各科级次(大量数据)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-10 18:05 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
各位大哥大姐,我这里有一组数据(学生成绩),一共有14科目,3个年级,共6300人,我想用一段代码求各科级次,我自己用累加法写代码时间太长,请问有没有什么好办法?如要时间短,代码应该如何写?有附件

工作簿1.rar

297.14 KB, 下载次数: 41

TA的精华主题

TA的得分主题

发表于 2014-3-10 18:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 yjh_27 于 2014-3-10 18:46 编辑

做个记号。
多长时间你能接受?

TA的精华主题

TA的得分主题

发表于 2014-3-10 19:26 | 显示全部楼层
本帖最后由 zax010 于 2014-3-10 19:29 编辑

“各科级次”按班级,年级,还是按全部排序?






TA的精华主题

TA的得分主题

发表于 2014-3-10 20:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我的电脑8.1s

工作簿1 (1).rar

349.89 KB, 下载次数: 65

TA的精华主题

TA的得分主题

发表于 2014-3-10 22:06 | 显示全部楼层
  1. Sub test()
  2.     Dim arr1, arr2, tm
  3.     tm = Timer
  4.     arr1 = Sheet1.Range("e2:r2101")
  5.     Sheet1.Range("t2:ag2101") = 1
  6.     arr2 = Sheet1.Range("t2:ag2101")
  7.     For i = 1 To UBound(arr1) - 1
  8.         For j = i + 1 To UBound(arr1)
  9.             For k = 1 To 14
  10.                 If arr1(i, k) > arr1(j, k) Then
  11.                     arr2(j, k) = arr2(j, k) + 1
  12.                 ElseIf arr1(i, k) < arr1(j, k) Then
  13.                     arr2(i, k) = arr2(i, k) + 1
  14.                 End If
  15.             Next k
  16.         Next j
  17.     Next i
  18.     Sheet1.Range("t2:ag2101") = arr2
  19.    
  20.    
  21.     arr1 = Sheet1.Range("e2102:r4201")
  22.     Sheet1.Range("t2102:ag4201") = 1
  23.     arr2 = Sheet1.Range("t2102:ag4201")
  24.     For i = 1 To UBound(arr1) - 1
  25.         For j = i + 1 To UBound(arr1)
  26.             For k = 1 To 14
  27.                 If arr1(i, k) > arr1(j, k) Then
  28.                     arr2(j, k) = arr2(j, k) + 1
  29.                 ElseIf arr1(i, k) < arr1(j, k) Then
  30.                     arr2(i, k) = arr2(i, k) + 1
  31.                 End If
  32.             Next k
  33.         Next j
  34.     Next i
  35.     Sheet1.Range("t2102:ag4201") = arr2
  36.    
  37.     arr1 = Sheet1.Range("e4202:r6301")
  38.     Sheet1.Range("t4202:ag6301") = 1
  39.     arr2 = Sheet1.Range("t4202:ag6301")
  40.     For i = 1 To UBound(arr1) - 1
  41.         For j = i + 1 To UBound(arr1)
  42.             For k = 1 To 14
  43.                 If arr1(i, k) > arr1(j, k) Then
  44.                     arr2(j, k) = arr2(j, k) + 1
  45.                 ElseIf arr1(i, k) < arr1(j, k) Then
  46.                     arr2(i, k) = arr2(i, k) + 1
  47.                 End If
  48.             Next k
  49.         Next j
  50.     Next i
  51.     Sheet1.Range("t4202:ag6301") = arr2
  52.     MsgBox Timer - tm
  53.    
  54. End Sub

复制代码
学习一下,累加花了43秒,

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-10 22:13 | 显示全部楼层
yjh_27 发表于 2014-3-10 20:20
我的电脑8.1s

谢谢,在我的电脑上运行的时间是2.875秒。代码虽然还没看懂,但我会认真学习的。在此真心的感谢yjh_27

TA的精华主题

TA的得分主题

发表于 2014-3-10 22:22 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Application.ScreenUpdating = False
  4.   t = Timer
  5.   With Worksheets("sheet1")
  6.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  7.     arr = .Range("a1:ag" & r)
  8.   End With
  9.   With Worksheets("sheet2")
  10.     .Select
  11.     .Cells.Delete
  12.     .Range("b1").Resize(r, 1) = Application.Index(arr, 0, 1)
  13.     .Range("a1") = "序号"
  14.     .Range("a2").Resize(r - 1, 1) = "=row()-1"
  15.     .Range("a2").Resize(r - 1, 1).Value = .Range("a2").Resize(r - 1, 1).Value
  16.     For j = 5 To 18
  17.       .Cells(1, 3).Resize(r - 1, 1) = Application.Index(arr, 0, j)
  18.       .Range("a1").Resize(r, 3).Sort key1:=Range("b2"), order1:=xlAscending, Key2:=Range("c2"), Order2:=xlDescending, Header:=xlYes
  19.       .Cells(2, 4) = 1
  20.       For i = 2 To r - 2
  21.         If .Cells(i, 2) <> .Cells(i - 1, 2) Then
  22.           .Cells(i, 4) = 1
  23.         Else
  24.           If .Cells(i, 3) = .Cells(i - 1, 3) Then
  25.             .Cells(i, 4) = .Cells(i - 1, 4)
  26.           Else
  27.             .Cells(i, 4) = .Cells(i - 1, 4) + 1
  28.           End If
  29.         End If
  30.       Next
  31.       .Range("a1").Resize(r, 4).Sort key1:=Range("a2"), order1:=xlAscending, Header:=xlYes
  32.       .Range("d2").Resize(r - 1, 4).Copy Worksheets("sheet1").Cells(2, j + 15)
  33.     Next
  34.   End With
  35.   Application.ScreenUpdating = True
  36.   Worksheets("sheet1").Select
  37.   MsgBox Timer - t
  38. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-3-10 22:23 | 显示全部楼层
利用sheet2做辅助表,共用时7秒多。供参考。

学生成绩排名.rar

490.04 KB, 下载次数: 44

TA的精华主题

TA的得分主题

发表于 2014-3-11 08:12 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Application.ScreenUpdating = False
  4.   t = Timer
  5.   With Worksheets("sheet1")
  6.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  7.     arr = .Range("a1:ag" & r)
  8.   End With
  9.   With Worksheets("sheet2")
  10.     .Select
  11.     .Cells.Delete
  12.     .Range("b1").Resize(r, 1) = Application.Index(arr, 0, 1)
  13.     .Range("a1") = "序号"
  14.     .Range("a2").Resize(r - 1, 1) = "=row()-1"
  15.     .Range("a2").Resize(r - 1, 1).Value = .Range("a2").Resize(r - 1, 1).Value
  16.     For j = 5 To 18
  17.       .Cells(1, 3).Resize(r, 1) = Application.Index(arr, 0, j)
  18.       .Range("a1").Resize(r, 3).Sort key1:=Range("b2"), order1:=xlAscending, Key2:=Range("c2"), Order2:=xlDescending, Header:=xlYes
  19.       .Range("d1").Resize(r, 1).ClearContents
  20.       brr = .Range("b1:d" & r)
  21.       For i = 2 To r
  22.         If Len(brr(i, 2)) <> 0 Then
  23.           If brr(i, 1) <> brr(i - 1, 1) Then
  24.             brr(i, 3) = 1
  25.           Else
  26.             If brr(i, 2) = brr(i - 1, 2) Then
  27.               brr(i, 3) = brr(i - 1, 3)
  28.             Else
  29.               brr(i, 3) = brr(i - 1, 3) + 1
  30.             End If
  31.           End If
  32.         End If
  33.       Next
  34.       .Range("d1").Resize(r, 1) = Application.Index(brr, 0, 3)
  35.       .Range("a1").Resize(r, 4).Sort key1:=Range("a2"), order1:=xlAscending, Header:=xlYes
  36.       .Range("d2").Resize(r - 1, 4).Copy Worksheets("sheet1").Cells(2, j + 15)
  37.     Next
  38.   End With
  39.   Application.ScreenUpdating = True
  40.   Worksheets("sheet1").Select
  41.   MsgBox Timer - t
  42. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2014-3-11 08:13 | 显示全部楼层
又优化了一下,运行时间缩短到了1.39秒。

学生成绩排名.rar

504.68 KB, 下载次数: 85

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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