ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 分类多条件提取问题,较难,请大神帮助

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-21 20:24 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 候鸟之细雨言寺 于 2024-3-22 15:28 编辑

多类别变化,提取问题,较难,请大神帮助,谢谢。按不同的班设置的前N名的区间,如30——42,即提取这个班的前30名到前42名的数据。

求助提取信息.zip

131.81 KB, 下载次数: 22

TA的精华主题

TA的得分主题

发表于 2024-3-21 21:08 | 显示全部楼层
你这表有问题啊! 你每个班别按要求选 N 个,但是,你的那个标准值 只给了一个。是要把 选出的N个实际值 与这个一标准值做减法?????

TA的精华主题

TA的得分主题

发表于 2024-3-21 21:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看“提取结果”表,共有16个班,需要每个班的前10名,不知这样理解对不对?

TA的精华主题

TA的得分主题

发表于 2024-3-21 22:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个问题最难的地方,是猜作者的意图很难。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-22 14:22 | 显示全部楼层
abc123281 发表于 2024-3-21 21:58
看“提取结果”表,共有16个班,需要每个班的前10名,不知这样理解对不对?

不是,是指定的前N名的区间,如30——42,即这个班的前30名到前42名的数据。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-22 14:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
cnmlgb9998 发表于 2024-3-21 21:08
你这表有问题啊! 你每个班别按要求选 N 个,但是,你的那个标准值 只给了一个。是要把 选出的N个实际值 与 ...

是指定的前N名的区间,如30——42,即这个班的前30名到前42名的数据。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-23 11:09 | 显示全部楼层
LIUZHU 发表于 2024-3-21 22:13
这个问题最难的地方,是猜作者的意图很难。

是指定的前N名的区间,如30——42,即这个班的前30名到前42名的数据。

TA的精华主题

TA的得分主题

发表于 2024-3-23 15:22 | 显示全部楼层
  1. Sub test1()
  2.   
  3.   Dim ar, br, cr(1 To 100, 1 To 80), dict(1) As Object
  4.   Dim setup, data, results, target As Range
  5.   Dim i As Long, j As Long, x As Long, y As Long
  6.   Dim pos As Long, col As Long, posRow As Long, rowSize As Long, colSize As Long
  7.   
  8.   Sheet3.Activate
  9.   Cells.Clear
  10.   
  11.   Application.ScreenUpdating = False
  12.   
  13.   For j = LBound(dict) To UBound(dict)
  14.     Set dict(j) = CreateObject("Scripting.Dictionary")
  15.   Next
  16.   
  17.   Set target = Range("A2")
  18.   
  19.   ar = Split("分数 排名 划线分 差值")
  20.   For i = 4 To UBound(cr)
  21.     cr(i, 1) = i - 3
  22.   Next
  23.   cr(1, 1) = "班别"
  24.   cr(3, 1) = "排序"
  25.   colSize = 2
  26.   
  27.   setup = Sheet1.Range("A1").CurrentRegion.Value
  28.   For i = 3 To UBound(setup)
  29.     dict(0).Add setup(i, 1), i ' Array(i, Split(setup(i, 2), "—"))
  30.   Next
  31.   For j = 3 To UBound(setup, 2)
  32.     dict(0).Add setup(2, j), j
  33.     cr(2, colSize) = setup(2, j)
  34.     dict(1).Add cr(2, colSize), colSize
  35.     For i = 0 To UBound(ar)
  36.       cr(3, colSize + i) = ar(i)
  37.     Next
  38.     colSize = colSize + 4
  39.   Next
  40.   colSize = colSize - 1
  41.   
  42.   With Sheet2
  43.     data = .Range("A1", .Range("A1").CurrentRegion.Offset(1)).Value
  44.   End With
  45.   QuickSort data, 2, UBound(data) - 1, 1, UBound(data, 2), 2, False '班级名为 数字 形式
  46.   
  47.   pos = 1
  48.   For i = 2 To UBound(data) - 1
  49.     If data(i, 2) <> data(i + 1, 2) Then
  50.       rowSize = 3
  51.       results = cr
  52.       results(1, 2) = data(i, 2)
  53.       posRow = dict(0)(data(pos + 1, 2))
  54.       br = Split(setup(posRow, 2), "—")
  55.       For x = 3 To UBound(setup, 2)
  56.         col = dict(1)(setup(2, x))
  57.         For y = 1 To br(1) - br(0) + 1
  58.           results(y + rowSize, col + 2) = setup(posRow, x)
  59.         Next
  60.       Next
  61.       QuickSort data, pos + 1, i, 1, UBound(data, 2), UBound(data, 2) - 1, True
  62.       For y = pos + br(0) To pos + br(1)
  63.         rowSize = rowSize + 1
  64.         For x = 6 To UBound(data, 2) Step 2
  65.           col = dict(1)(data(1, x))
  66.           results(rowSize, col) = data(y, x)
  67.           results(rowSize, col + 1) = data(y, x + 1)
  68.           If results(rowSize, col) Then results(rowSize, col + 3) = results(rowSize, col) - results(rowSize, col + 2)
  69.         Next
  70.         If data(y, 2) <> data(y + 1, 2) Then Exit For
  71.       Next
  72.       With target
  73.         .Resize(rowSize, colSize).Value = results
  74.         With .CurrentRegion
  75.           Intersect(.Offset(0), .Offset(1)).Borders.LineStyle = xlContinuous
  76.           .HorizontalAlignment = xlCenter
  77.           .Font.Name = "宋体"
  78.           .Rows("1:3").Font.Bold = True
  79.         End With
  80.         For j = 2 To colSize Step 4
  81.           .Offset(1, j - 1).Resize(, UBound(ar) + 1).HorizontalAlignment = xlCenterAcrossSelection
  82.         Next
  83.       End With
  84.       Set target = Cells(Rows.Count, 1).End(xlUp).Offset(2)
  85.       pos = i
  86.     End If
  87.   Next
  88.   
  89.   Set target = Nothing
  90.   For j = LBound(dict) To UBound(dict)
  91.     Set dict(j) = Nothing
  92.   Next
  93.   
  94.   Application.ScreenUpdating = True
  95.   Beep
  96. End Sub

  97. Function QuickSort(ar, u As Long, d As Long, l As Long, r As Long, pCol As Long, Optional Flag As Boolean = True)
  98.   Dim t As Long, b As Long, j As Long, x As Long, pivot, swap
  99.   t = u
  100.   b = d
  101.   pivot = ar((u + d) \ 2, pCol)
  102.   While t <= b
  103.     If Flag Then        'Order by number DESC
  104.       Do While t < d
  105.         If ar(t, pCol) > pivot Then t = t + 1 Else Exit Do
  106.       Loop
  107.       Do While b > u
  108.         If ar(b, pCol) < pivot Then b = b - 1 Else Exit Do
  109.       Loop
  110.     Else                'Order by number ASC
  111.       Do While t < d
  112.         If ar(t, pCol) < pivot Then t = t + 1 Else Exit Do
  113.       Loop
  114.       Do While b > u
  115.         If ar(b, pCol) > pivot Then b = b - 1 Else Exit Do
  116.       Loop
  117.     End If
  118.     If t < b Then
  119.       For x = l To r
  120.         swap = ar(t, x): ar(t, x) = ar(b, x): ar(b, x) = swap
  121.       Next
  122.       t = t + 1: b = b - 1
  123.     Else
  124.       If t = b Then t = t + 1: b = b - 1
  125.     End If
  126.   Wend
  127.   If t < d Then QuickSort ar, t, d, l, r, pCol, Flag
  128.   If b > u Then QuickSort ar, u, b, l, r, pCol, Flag
  129. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2024-3-23 15:28 | 显示全部楼层
求助提取信息.zip (152.04 KB, 下载次数: 15)

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-23 18:29 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 23:27 , Processed in 0.039696 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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