ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-26 14:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

感谢您的帮助,请问有提取结果表中的B列增加姓名,如何处理为好?谢谢您。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-26 14:54 | 显示全部楼层

感谢您的帮助,请问在提取结果的表中在增加B列为姓名,要如何设置?敬请您的帮助。
QQ图片20240326145027.png

TA的精华主题

TA的得分主题

发表于 2024-3-26 15:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
候鸟之细雨言寺 发表于 2024-3-26 14:54
感谢您的帮助,请问在提取结果的表中在增加B列为姓名,要如何设置?敬请您的帮助。

Sub test1() '测试吧,写这个真不易……
  
  Dim set_, data, results, target As Range
  Dim ar, br(1 To 160, 1 To 80), cr, dict(1) As Object
  Dim i As Long, j As Long, p As Long, x As Long, y As Long
  Dim posRow As Long, posCol As Long, rowSize As Long, colSize As Long, iStep As Long
  
  Sheet3.Activate
  Cells.Clear
  
  Application.ScreenUpdating = False
  
  For j = LBound(dict) To UBound(dict)
    Set dict(j) = CreateObject("Scripting.Dictionary")
  Next
  
  ar = Split("分数 排名 划线分 差值")
  iStep = UBound(ar) + 1
  
  br(1, 1) = "班别"
  br(2, 1) = "排序"
  br(2, 2) = "姓名"
  For i = 4 To UBound(br)
    br(i, 1) = i - 3
  Next
  
  set_ = Sheet1.Range("A1").CurrentRegion.Value
  For i = 3 To UBound(set_)
    dict(0).Add set_(i, 1), i                                           'Array(i, Split(set_(i, 2), "—"))
  Next
  
  rowSize = 3
  colSize = 3
  For j = 3 To UBound(set_, 2)
    dict(0).Add set_(2, j), j
    br(rowSize - 1, colSize) = set_(2, j)
    dict(1).Add br(2, colSize), colSize
    For i = 0 To UBound(ar)
      br(rowSize, colSize + i) = ar(i)
    Next
    colSize = colSize + iStep
  Next
  colSize = colSize - 1
  
  With Sheet2
    data = .Range("A1", .Range("A1").CurrentRegion.Offset(1)).Value
  End With
  QuickSort data, 2, UBound(data) - 1, 1, UBound(data, 2), 2, False     '班级名为 数字 形式
  
  p = 1
  Set target = Range("A2")
  For i = 2 To UBound(data) - 1
    If data(i, 2) <> data(i + 1, 2) Then
      results = br
      results(1, 2) = data(i, 2)
      posRow = dict(0)(data(i, 2))
      cr = Split(set_(posRow, 2), "—")
      For x = 3 To UBound(set_, 2)
        posCol = dict(1)(set_(2, x)) + 2
        For y = 1 To cr(1) - cr(0) + 1
          results(y + rowSize, posCol) = set_(posRow, x)
        Next
      Next
      QuickSort data, p + 1, i, 1, UBound(data, 2), UBound(data, 2) - 1, True
      If p + cr(0) < i + 1 Then
        For y = p + cr(0) To p + cr(1)
          rowSize = rowSize + 1
          results(rowSize, 2) = data(y, 4)
          For x = 6 To UBound(data, 2) Step 2
            posCol = dict(1)(data(1, x))
            For j = 0 To 1
              results(rowSize, posCol + j) = data(y, x + j)
            Next
            If Len(data(y, x)) Then
              If Len(results(rowSize, posCol + j)) Then _
                results(rowSize, posCol + 3) = data(y, x) - results(rowSize, posCol + j)
            Else
              results(rowSize, posCol + j) = ""
            End If
          Next
          If data(y, 2) <> data(y + 1, 2) Then Exit For
        Next
      End If
      p = i
      With target
        .Resize(rowSize, colSize).Value = results
        .Offset(1).Resize(2).Merge
        .Offset(1, 1).Resize(2).Merge
        With .CurrentRegion
          Intersect(.Offset(0), .Offset(1)).Borders.LineStyle = xlContinuous
          .HorizontalAlignment = xlCenter
          .VerticalAlignment = xlCenter
          .Rows("1:3").Font.Bold = True
          .Font.Name = "宋体"
        End With
        For j = 3 To colSize Step iStep
          .Offset(1, j - 1).Resize(, iStep).HorizontalAlignment = xlCenterAcrossSelection
        Next
      End With
      Set target = Cells(Rows.Count, "A").End(xlUp).Offset(2)
      rowSize = 3
    End If
  Next
  
  Set target = Nothing
  For j = LBound(dict) To UBound(dict)
    Set dict(j) = Nothing
  Next
  
  Application.ScreenUpdating = True
  Beep
End Sub

Function QuickSort(ar, u As Long, d As Long, l As Long, r As Long, pCol As Long, Optional Flag As Boolean = True)
  Dim t As Long, b As Long, j As Long, x As Long, pivot, swap
  t = u
  b = d
  pivot = ar((u + d) \ 2, pCol)
  While t <= b
    If Flag Then        'Order by number DESC
      Do While t < d
        If ar(t, pCol) > pivot Then t = t + 1 Else Exit Do
      Loop
      Do While b > u
        If ar(b, pCol) < pivot Then b = b - 1 Else Exit Do
      Loop
    Else                'Order by number ASC
      Do While t < d
        If ar(t, pCol) < pivot Then t = t + 1 Else Exit Do
      Loop
      Do While b > u
        If ar(b, pCol) > pivot Then b = b - 1 Else Exit Do
      Loop
    End If
    If t < b Then
      For x = l To r
        swap = ar(t, x): ar(t, x) = ar(b, x): ar(b, x) = swap
      Next
      t = t + 1: b = b - 1
    Else
      If t = b Then t = t + 1: b = b - 1
    End If
  Wend
  If t < d Then QuickSort ar, t, d, l, r, pCol, Flag
  If b > u Then QuickSort ar, u, b, l, r, pCol, Flag
End Function

'Do While t < d
'  If (ar(t, pCol) > pivot) Xor Flag Then t = t + 1 Else Exit Do
'Loop
'Do While b > u
'  If (ar(b, pCol) < pivot) Xor Flag Then b = b - 1 Else Exit Do
'Loop

TA的精华主题

TA的得分主题

发表于 2024-3-26 15:28 | 显示全部楼层
候鸟之细雨言寺 发表于 2024-3-26 14:54
感谢您的帮助,请问在提取结果的表中在增加B列为姓名,要如何设置?敬请您的帮助。

见附件代码已传这一审就是数小时.zip (153.03 KB, 下载次数: 15)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-3-26 16:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

万分感谢您的帮助,谢谢。

TA的精华主题

TA的得分主题

发表于 2024-3-26 16:24 | 显示全部楼层
候鸟之细雨言寺 发表于 2024-3-26 16:13
万分感谢您的帮助,谢谢。

不要万分,只要送2分,安抚一下哥这疲惫的心
从构思、编写、写成、到修改,哥可是耗时数十分钟
哎,太苦了……一言难尽……

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-11-17 23:39 , Processed in 0.037292 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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