ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 用vb进行条件排名

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-19 16:21 | 显示全部楼层 |阅读模式
又求助各位路过的大神伸援手了,想对下表数据进行条件排名,用数组公式如行数很多的话,计算很慢,想用vb代替公式,不知能否实现。感谢感谢!
姓名(A列)本月出勤天数(B列)本月出勤工时(C列)本月业绩(D列)业绩排名(E列)
张1
20
180
80
7
张2
22
200
85
6
张3
26
240
95
3
张4
26
250
100
1
张5
26
255
95
4
张6
26
250
93
5
张7
15
120
50
张8
28
270
100
2
张9
18
200
85
B>=20C>=180
说明:参与业绩排名需要(B>=20,C>=180)条件同时成立,用公式进行排名如行数较多就计算很慢,求用VB进行排名提高速度

条件排名.rar

7.45 KB, 下载次数: 21

TA的精华主题

TA的得分主题

发表于 2018-8-19 16:31 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   With Worksheets("sheet1")
  7.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  8.     .Range("e2:e" & r).ClearContents
  9.     arr = .Range("a2:e" & r)
  10.     For i = 1 To UBound(arr)
  11.       If arr(i, 2) >= 20 And arr(i, 3) >= 180 Then
  12.         d(arr(i, 4)) = d(arr(i, 4)) + 1
  13.       End If
  14.     Next
  15.     nn = 1
  16.     kk = d.keys
  17.     For k = 0 To UBound(kk)
  18.       mm = Application.Large(kk, k + 1)
  19.       ss = d(mm)
  20.       d(mm) = nn
  21.       nn = nn + ss
  22.     Next
  23.     For i = 1 To UBound(arr)
  24.       If arr(i, 2) >= 20 And arr(i, 3) >= 180 Then
  25.         arr(i, 5) = d(arr(i, 4))
  26.       End If
  27.     Next
  28.     .Range("a2:e" & r) = arr
  29.   End With
  30. End Sub
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-19 16:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
详见附件。

条件排名.zip

15.85 KB, 下载次数: 59

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-19 16:40 | 显示全部楼层

谢谢chxw68老师!好感动!这么快就回复!问题ok了,太好啦!
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2018-8-19 17:18 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-19 19:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
mikezhan 发表于 2018-8-19 17:18
业绩值相同的,排名相同。之后的排名将跳过。

Sub test()

谢谢mikezhan老师!

TA的精华主题

TA的得分主题

发表于 2018-8-19 19:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-8-19 20:04 | 显示全部楼层
如果成绩在1到100之间,就这样排,最简单
Sub test()
arr = Range("A2:d" & Cells(Rows.Count, 1).End(xlUp).Row)
ReDim brr(1 To 100, 1 To 2)
For i = 1 To UBound(arr)
    If arr(i, 2) >= 20 And arr(i, 3) >= 80 Then
        brr(arr(i, 4), 2) = brr(arr(i, 4), 2) & "|" & i
    End If
Next
n = 1
For i = 100 To 1 Step -1
    If brr(i, 2) <> "" Then
        s = Split(brr(i, 2), "|")
        For j = 1 To UBound(s)
            brr(Int(s(j)), 1) = n
        Next
        n = n + UBound(s)
    End If
Next
Sheet1.[f2].Resize(UBound(arr), 1) = brr
End Sub

TA的精华主题

TA的得分主题

发表于 2018-8-19 20:12 | 显示全部楼层
给一个不同的思路。
  1. Sub fyExcelVBA()
  2. Dim arr, brr, arr1, i&, j%, nRow%, nCol%, str$
  3. Dim dic As Object
  4. Application.ScreenUpdating = False
  5. Application.DisplayAlerts = False
  6. Set dic = CreateObject("scripting.dictionary")
  7. With Sheets("sheet1")
  8.     nRow = .Range("a" & Rows.Count).End(3).Row
  9.     nCol = .Cells(1, Columns.Count).End(1).Column
  10.     arr = .Range("a1").Resize(nRow, nCol - 1)
  11.     brr = .Range(.Cells(1, nCol), .Cells(nRow, nCol))
  12. End With

  13. For i = 2 To UBound(arr)
  14.     If arr(i, 2) < 20 Or arr(i, 3) < 180 Then
  15.        For j = 1 To UBound(arr, 2)
  16.            arr(i, j) = ""
  17.        Next j
  18.     End If
  19. Next i
  20. str = "中间转换"
  21. Sheets.Add.Name = str
  22. With Sheets(str).Range("a1").Resize(nRow, nCol - 1)
  23.   .Value = arr
  24.   .Sort key1:=.Cells(1, nCol - 1), order1:=xlDescending
  25. End With
  26. arr1 = Sheets(str).Range("a1").CurrentRegion
  27. For i = 2 To UBound(arr1)
  28.   n = n + 1
  29.   dic(arr1(i, 1)) = n
  30. Next i

  31. For i = 2 To UBound(brr)
  32.   If Not dic.exists(arr(i, 1)) Then
  33.   brr(i, 1) = ""
  34.   Else
  35.   brr(i, 1) = dic(arr(i, 1))
  36.   End If
  37. Next i
  38. With Sheets("sheet1")
  39. .Range(.Cells(1, nCol), .Cells(nRow, nCol)) = brr
  40. End With
  41. Set dic = Nothing
  42. Sheets(str).Delete
  43. Application.ScreenUpdating = True
  44. Application.DisplayAlerts = True
  45. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2018-8-19 20:26 来自手机 | 显示全部楼层
不知道为什么 发表于 2018-8-19 19:56
褚老师,有段时间没怎么看到您了啊,近期都好把?

前段时间自驾游,谢谢你挂念。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 13:28 , Processed in 0.027448 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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