ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求教一个如何实现表格的N次排序功能的VBA

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-4-29 17:00 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 zouxu1120 于 2024-4-29 17:16 编辑

各位大佬,小白请教一个VBA咋做啊,实现表格的N次排序功能。


针对“北京”部分。
第一次排序,对B列:
1、带有项目编号的放在前面
2、不带项目编号的放在后面。


第二次排序,对I列:
1)B列带项目号的行
1、单元格里有文字内容的,排在前面
2、单元格里是日期的排在中间,按照日期升序排列
3、单元格里是空的,排在最后

2)B列不带项目号的行
1、单元格里有文字内容的,排在前面
2、单元格里是日期的排在中间,按照日期升序排列
3、单元格里是空的,排在最后



原始:
原始.jpg


操作效果:
效果.jpg



最终效果:
效果图.jpg
123.rar (58 KB, 下载次数: 7)

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-29 17:06 | 显示全部楼层
用chatgpt做了一个,但是只能搞定第一次排序。


Sub 一按项目号排序() ' 带项目号的放在前面,不带项目号的放在后面,但是没有排序
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim startRow As Long
    Dim endRow As Long
    Dim oneRow As Long
    Dim twoRow As Long
    Dim sortRange As Range
    Dim cell As Range
    Dim moveRow As Long
    Dim j As Long
   
    ' 设置要操作的工作表
    Set ws = ThisWorkbook.Sheets("周报")
   
    ' 获取最后一行的行号
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
   
    startRow = 0
    endRow = 0
    oneRow = 0
    twoRow = 0
    moveRow = 0
   
    ' 遍历数据
    For i = 2 To lastRow
        If ws.Cells(i, 1).Value = "一" Then
            oneRow = i
            startRow = i + 1
        ElseIf ws.Cells(i, 1).Value = "二" Then
            twoRow = i
            endRow = i - 1
        End If
        
        ' 找到"一"和"二"之间的数据行后进行处理
        If startRow > 0 And endRow > 0 Then
            ' 对"一"和"二"之间的数据行进行排序
            Set sortRange = ws.Range(ws.Cells(startRow, 1), ws.Cells(endRow, 16))
            sortRange.Sort key1:=ws.Range("A" & startRow), order1:=xlAscending, Header:=xlNo
            
            ' 将包含"-"的行移动到"一"下方,不包含"-"的行移动到最后一个包含"-"的行的下方
            For Each cell In sortRange.Columns(2).Cells
                If InStr(cell.Value, "-") > 0 Then
                    If moveRow = 0 Then
                        moveRow = oneRow + 1
                    End If
                    ws.Rows(cell.Row).Cut Destination:=ws.Rows(moveRow)
                    moveRow = moveRow + 1
                End If
            Next cell
            
            moveRow = 0
            For j = sortRange.Rows.Count To 1 Step -1
                If InStr(ws.Cells(sortRange.Cells(j, 2).Row, 2).Value, "-") > 0 Then
                    moveRow = ws.Cells(sortRange.Cells(j, 2).Row, 2).Row + 1
                    Exit For
                End If
            Next j
            
            For Each cell In sortRange.Columns(2).Cells
                If InStr(cell.Value, "-") = 0 Then
                    ws.Rows(cell.Row).Cut Destination:=ws.Rows(moveRow)
                    moveRow = moveRow + 1
                End If
            Next cell
            
            Exit For
        End If
    Next i
        
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-29 17:06 | 显示全部楼层
本帖最后由 zouxu1120 于 2024-4-29 17:12 编辑

第二次排序一直没有搞定。

TA的精华主题

TA的得分主题

发表于 2024-4-29 17:18 | 显示全部楼层
项目编号与其他的文字如何区分?项目编号如果是文字呢?其他的文字若也是在数字开头呢?

TA的精华主题

TA的得分主题

发表于 2024-4-29 21:38 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
可以预处理一下,根据不同情况在B列加上abcd,排序后再恢复。

TA的精华主题

TA的得分主题

发表于 2024-4-29 21:39 来自手机 | 显示全部楼层
比如,有项目编号前加A,文字加B,空格加C

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-30 20:26 | 显示全部楼层
本帖最后由 zouxu1120 于 2024-4-30 20:27 编辑
lcluck2002 发表于 2024-4-29 17:18
项目编号与其他的文字如何区分?项目编号如果是文字呢?其他的文字若也是在数字开头呢?


只区分带项目编号和不带编号,也就是区分是否带“-”来处理

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-5 11:02 | 显示全部楼层
已经搞定了。还是采用辅助列排序。针对B列,辅助列设置成1.2。第一次排序;针对I列,辅助列设置1.2.3.4.5.6.第二次排序。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-21 21:13 , Processed in 0.035309 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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