ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助:用VBA提取数据并进行排名

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-20 21:52 | 显示全部楼层
longkkkk 发表于 2019-4-20 01:55
我也是新手,刚刚学习VBA,可能写得比较啰嗦,你看看可不可以用

代码是没有那些高手写的简洁,测试了,但能达到想要的效果,我也基本能看得懂。但写入数据采用单个单个的写入,数据多后可能会很慢。有了你的思路和方法,我再改为写入数组,再用数组写入到表格中,可能速度会快一点。

有两个地方不太明白,请你帮解释一下:
第一问:Range("W" & i).Value = Application.WorksheetFunction.Rank(Range("V" & i).Value, Range("V" & uprow(Range("C" & i)) & ":V" & downrow(Range("C" & i))), 0)  中的 Range("V" & uprow(Range("C" & i)) & ":V" & downrow(Range("C" & i)) 指的是区域,但我没太明白。
第二问:就是你自定义的那两个功能
Function uprow(ByVal aaa As Range)
    Dim h, l, i&
    h = aaa.Row
    l = aaa.Column
    For i = aaa.Row To 1 Step -1
        If aaa.Value <> Cells(i, l).Value Then Exit For
    Next
    uprow = i + 1
End Function

Function downrow(ByVal aaa As Range)
    Dim h, l, i&
    h = aaa.Row
    l = aaa.Column
    For i = aaa.Row To Rows.Count
        If aaa.Value <> Cells(i, l).Value Then Exit For
    Next
    downrow = i - 1
End Function

能注释一下吗?没明白是什么意思。

TA的精华主题

TA的得分主题

发表于 2019-4-20 22:27 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
其实就是工作表的rank函数,uprow和downrow就是用来确定rank的区域的

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-20 23:29 来自手机 | 显示全部楼层
longkkkk 发表于 2019-4-20 22:27
其实就是工作表的rank函数,uprow和downrow就是用来确定rank的区域的

一看就知道是rank函数,我只是没看明白uprow和downrow是怎么个回事,简单描述一下可行?

TA的精华主题

TA的得分主题

发表于 2019-4-20 23:39 | 显示全部楼层
本帖最后由 乐乐2006201505 于 2019-4-21 09:02 编辑

建立个mb(1-2)工作表,把其它三科删除。设计好表格即可。无法上传附件。
Sub 排名()
Dim s As String, ss As String, arr, brr, vs, i%, j%, i1%
Application.ScreenUpdating = False
Application.DisplayAlerts = False
With Sheets("基本信息设置")
  s = "成绩总表(" & .Range("d2") & ")"
  ss = .Range("d2")
End With
With Sheets("原始成绩")
  arr = .[a1].CurrentRegion
End With
  If IsSheetExist(s) Then Sheets(s).Delete
  Sheets("mb(1-2)").Copy before:=Sheets(2)
  ActiveSheet.Name = s
  vs = Array(1, 2, 3, 4, 5, 6, 10, 14, 18, 22, 26)
  ReDim brr(1 To UBound(arr), 1 To 29)
With Sheets(s)
  For i = 4 To UBound(arr)
    If arr(i, 3) = Left(ss, 1) Then
      i1 = i1 + 1
      For j = 3 To 10
        brr(i1, vs(0)) = arr(i, 2)
        brr(i1, vs(j - 2)) = arr(i, j)
        brr(i1, vs(9)) = arr(i, 14)
        brr(i1, vs(10)) = arr(i, 15)
      Next j
    End If
  Next i
  .Range("a5").Resize(UBound(brr), 29) = brr
  r = .Cells(.Rows.Count, 1).End(3).Row
  .Rows("5:5").Select
  Selection.Copy
  .Rows("6:" & r).Select
  Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
      SkipBlanks:=False, Transpose:=False
  Application.CutCopyMode = False
  .Range("a5").Select
End With
For c1 = 6 To 29 Step 4
  Call zpm(c1, c1 + 3, 4) '第一个参数为排名列号,第二个参数为排名列,第三参数为标题行数
  Call xpm(c1, c1 + 2, 4)
  Call bpm(c1, c1 + 1, 4)
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
MsgBox "本次成绩统计已完成!" & Chr(13) & Chr(13) & "总运行时间为:" & Timer - tim & " 秒!"
End Sub

Function IsSheetExist(SheetName) As Boolean '判断是否存在某工作表
On Error GoTo eee
Dim a: a = Sheets(SheetName).Name
IsSheetExist = True
eee:
End Function

Sub zpm(c1, c2, br) '总排名
  Dim arr1, brr1, x&, y&, i&, r&
  r = Cells(Rows.Count, c1).End(3).Row '这就是取得l列最后一行的行号
  arr1 = Range(Cells(br + 1, c1), Cells(r, c1))
  ReDim brr1(1 To UBound(arr1), 1 To 1)
  For x = 1 To UBound(arr1)
    i = UBound(arr1)
    For y = 1 To UBound(arr1)
      If arr1(x, 1) >= arr1(y, 1) And x <> y Then i = i - 1
    Next y
    Cells(x + br, c2) = i
  Next x
End Sub

Sub xpm(c1, c2, br) '校排名
  Dim arr1, brr1, x&, y&, i&, r&
  r = Application.CountIf(Range(Cells(br + 1, 1), Cells(Cells(Rows.Count, 1).End(3).Row, c1)), "学校1")
  r1 = Cells(Rows.Count, c1).End(3).Row '这就是取得l列最后一行的行号
  arr1 = Range(Cells(br + 1, c1), Cells(r + br, c1))
  ReDim brr1(1 To UBound(arr1), 1 To 1)
  For x = 1 To UBound(arr1)
    i = UBound(arr1)
    For y = 1 To UBound(arr1)
      If arr1(x, 1) >= arr1(y, 1) And x <> y Then i = i - 1
    Next y
    Cells(x + br, c2) = i
  Next x
  arr2 = Range(Cells(r + br + 1, c1), Cells(r1, c1))
  ReDim brr2(1 To UBound(arr2), 1 To 1)
  For x1 = 1 To r1 - r - br
    i = UBound(arr2)
    For y1 = 1 To UBound(arr2)
      If arr2(x1, 1) >= arr2(y1, 1) And x1 <> y1 Then i = i - 1
    Next y1
    Cells(x1 + r + br, c2) = i
  Next x1
End Sub

Sub bpm(c1, c2, br) '班排名
  Dim arr1, brr1, x&, y&, i&, r&, vs()
  On Error Resume Next
  r1 = Cells(Rows.Count, c1).End(3).Row '这就是取得l列最后一行的行号
  For i2 = 1 To r1
    arr2 = Range(Cells(br, 3), Cells(r1 + br, 3))
    If arr2(i2, 1) <> arr2(i2 + 1, 1) Then
      c = c + 2
      ReDim Preserve vs(1 To c)
      vs(c - 1) = i2 + br - 1: vs(c) = i2 + br
    End If
  Next i2
  For i3 = 2 To UBound(vs) - 2 Step 2
    arr1 = Range(Cells(vs(i3), c1), Cells(vs(i3 + 1), c1))
    ReDim brr1(1 To UBound(arr1), 1 To 1)
    For x = 1 To UBound(arr1)
      i = UBound(arr1)
      For y = 1 To UBound(arr1)
        If arr1(x, 1) >= arr1(y, 1) And x <> y Then i = i - 1
      Next y
      Cells(x + vs(i3) - 1, c2) = i
    Next x
  Next i3
End Sub

TA的精华主题

TA的得分主题

发表于 2019-4-21 00:23 | 显示全部楼层
本帖最后由 longkkkk 于 2019-4-21 01:01 编辑
wuchengde 发表于 2019-4-20 23:29
一看就知道是rank函数,我只是没看明白uprow和downrow是怎么个回事,简单描述一下可行?

uprow(a)就是向上找与单元格a的内容相同的行号最小的单元格,并返回它的行值,我就是为了找同一个学校或者是同一个班,确定rank的区域

TA的精华主题

TA的得分主题

发表于 2019-4-21 12:18 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-21 13:44 | 显示全部楼层
longkkkk 发表于 2019-4-21 00:23
uprow(a)就是向上找与单元格a的内容相同的行号最小的单元格,并返回它的行值,我就是为了找同一个学校 ...

谢谢,明白了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-21 13:45 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-21 13:54 | 显示全部楼层

好,快速。可以的话,麻烦上传代码,大家学习学习!

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-4-21 14:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
乐乐2006201505 发表于 2019-4-20 23:39
建立个mb(1-2)工作表,把其它三科删除。设计好表格即可。无法上传附件。
Sub 排名()
Dim s As String, ss ...

一、二年级是可以了,但三-六年级没考虑统计英语、科学、品德
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 15:44 , Processed in 0.036773 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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