ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 多列排序、多列数据相同的行对齐,否则插入空行

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-21 14:37 | 显示全部楼层
tender888 发表于 2022-12-21 14:33
我是小白一个,工作中需要用到的时候才现学现买。怎么送花啊,真的好想感谢这些给我帮助的大师 ...

知道在哪送花了

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-24 11:42 | 显示全部楼层
笨鸟飞不高 发表于 2022-12-21 12:47
当前附件,凑一个!

大师有空麻烦帮忙解释一下或者说下思路,我看了两天还是看不明白思路

Sub AwTest()
    Dim i&, j%, c%, x&, r&, m&, h&, lSr$, Sr$, eRow&, arr, kAr, Ar, Br, d As Object
    Set d = CreateObject("Scripting.Dictionary")
    lSr = "一,1,二,2,三,3"
    With Sheets("Temp")
        eRow = Application.Max(.Cells(Rows.Count, "D").End(3).Row, _
                    .Cells(Rows.Count, "I").End(3).Row)
        arr = .Range("A2:I" & eRow)
        ReDim tAr(1 To UBound(arr) * 2, 1 To 5)
        For i = 1 To UBound(arr)
            For j = 1 To UBound(arr, 2) Step 5
                If j = 1 Then c = 4 Else c = 5
                If Len(arr(i, j)) Then
                    Sr = arr(i, j) & "|" & arr(i, j + 1) & "|" & arr(i, j + 2)
                    x = d(Sr)
                    If x = 0 Then
                        r = r + 1: x = r: d(Sr) = x
                        tAr(x, 1) = Val(Mid(lSr, InStr(lSr, Split(arr(i, j), "类")(0)) + 2, 1))
                        tAr(x, 2) = Val(Split(arr(i, j + 1), "类")(0))
                        tAr(x, 3) = Val(Split(arr(i, j + 2), "名称")(1))
                    End If
                    tAr(x, c) = IIf(tAr(x, c) = "", i, tAr(x, c) & "|" & i)
                End If
            Next
        Next
        
        kAr = Array(1, 1, 2, 1, 3, 1)
        bSort tAr, 1, r, 1, 5, kAr
        
        ReDim brr(1 To UBound(arr) * 2, 1 To UBound(arr, 2))
        x = 0
        For i = 1 To r
            Ar = Split(tAr(i, 4), "|"): Br = Split(tAr(i, 5), "|")
            m = Application.Max(UBound(Ar), UBound(Br))
            For h = 0 To m
                x = x + 1
                If h <= UBound(Ar) Then
                    For j = 1 To 4
                        brr(x, j) = arr(Val(Ar(h)), j)
                    Next
                End If
                If h <= UBound(Br) Then
                    For j = 6 To 9
                        brr(x, j) = arr(Val(Br(h)), j)
                    Next
                End If
            Next
        Next
        .Range("U2").Resize(x, UBound(brr, 2)) = brr
    End With
End Sub

Sub bSort(arr, TLine, BLine, LLine, RLine, kAr)
    Dim i&, j&, u%, m%, o%, k%, tt
    u = UBound(kAr) - 1
    For m = u To 0 Step -2
        o = kAr(m + 1)
        For i = BLine To TLine + 1 Step -1
            For j = TLine To i - 1
                If o = 1 Then
                    If arr(j, kAr(m)) > arr(j + 1, kAr(m)) Then
                        For k = LLine To RLine
                            tt = arr(j, k): arr(j, k) = arr(j + 1, k): arr(j + 1, k) = tt
                        Next
                    End If
                Else
                    If arr(j, kAr(m)) < arr(j + 1, kAr(m)) Then
                        For k = LLine To RLine
                            tt = arr(j, k): arr(j, k) = arr(j + 1, k): arr(j + 1, k) = tt
                        Next
                    End If
                End If
            Next
        Next
    Next
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 03:32 , Processed in 0.035987 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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