ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] Excel 利用VBA自动排序的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-7-27 16:09 | 显示全部楼层
hugh1236 发表于 2018-7-27 15:14
大佬不好意思,新手上路,想法太简单了。而且这表一直被要求改这改那,这个又是涉密的文件,只好自己仿照 ...

'好像差不多,有问题留言

Option Explicit

Sub test()
  Dim arr, i, j, k, kk, a, b, brr
  arr = Range("a6:j" & Cells(Rows.Count, "b").End(xlUp).Row + 1)
  brr = arr
  Call dsort(arr, 1, UBound(arr, 1) - 1, 4)
  For i = 1 To UBound(arr, 1) - 1
    For j = i To UBound(arr, 1) - 1
      If arr(j, 4) <> arr(j + 1, 4) Then
        a = i - 1: b = j + 1
        For k = i To j
          If arr(k, 5) = "甲" Then
            b = b - 1
            For kk = 1 To UBound(arr, 2): brr(b, kk) = arr(k, kk): Next
          Else
            a = a + 1
            For kk = 1 To UBound(arr, 2): brr(a, kk) = arr(k, kk): Next
          End If
        Next
        For k = i To j
          For kk = 1 To UBound(arr, 2): arr(k, kk) = brr(k, kk): Next
        Next
        If a <> i - 1 Then Call dsort(arr, i, a, 10)
        If b <> j + 1 Then Call dsort(arr, b, j, 10)
        i = j: Exit For
      End If
  Next j, i
  [l6].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
End Sub

Function dsort(arr, first, last, key)
  Dim i, j, k, t
  For i = first To last - 1
    For j = i + 1 To last
      If arr(i, key) < arr(j, key) Then
        For k = 1 To UBound(arr, 2)
          t = arr(i, k): arr(i, k) = arr(j, k): arr(j, k) = t
        Next
      End If
  Next j, i
End Function

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-30 09:47 | 显示全部楼层
本帖最后由 hugh1236 于 2018-7-30 09:49 编辑
一把小刀闯天下 发表于 2018-7-27 16:09
'好像差不多,有问题留言

Option Explicit

大神非常感谢,不过还得麻烦下你,本来已经达到我设想的排序了,我们领导又加了1个条件,然后我又添加了一个排序(条件3),可是不管我将这段放在哪里都不能满足领导要的排序。现在的要求是“条件”>“条件3”>“条件1”,“条件2”还是降序,“条件1”中同一项中“条件3”按自定义排序(“AAA”,"BBB","CCC"),“条件1”还是“甲”排在后面。就是说“条件”A这类中“条件1”为“甲”的全部放在最后,并按“条件3”排序。其实,“条件1”的数据只有遇到“甲”的时候,才需要将它放在“条件”A类的最后,其它时候“条件1”并不参与排序。因为这个表一直在讨论要达到什么程度,所以我严重怀疑领导可能还要加条件,如果再加我要怎么改?还有就是A列能不能不参与排序,我想让它保持原有的数据(里面为公式),排序后这列变数值了。还请大神帮帮忙,谢谢!
  1. <div class="blockcode"><blockquote>Option Explicit

  2. Const TITLENUM = 5 '标题行数量,这里为1行,修改
  3. Const COL_1 = 6, COL_2 = 13, COL_3 = 5 '"条件1"、"条件2"、"条件"的对应的列号,修改
  4. Const FINDSTR = "甲" '查找的字符串,修改


  5. Sub 按钮1_Click()

  6.     Application.ScreenUpdating = False
  7.       With Sheet1.Range("B6:o" & Range("A100").End(xlUp).Row)
  8. '--------------------------------------------------------------------------------------------
  9. Dim arr, i, j, k, kk, a, b, brr
  10.   arr = Range("a6:o" & Cells(Rows.Count, "d").End(xlUp).Row + 1)    '源数据工作表及位置
  11.   brr = arr
  12.   Call dsort(arr, 1, UBound(arr, 1) - 1, COL_3)
  13.   For i = 1 To UBound(arr, 1) - 1
  14.     For j = i To UBound(arr, 1) - 1
  15.       If arr(j, COL_3) <> arr(j + 1, COL_3) Then
  16.         a = i - 1: b = j + 1
  17.         For k = i To j
  18.           If arr(k, COL_1) = FINDSTR Then
  19.             b = b - 1
  20.             For kk = 1 To UBound(arr, 2): brr(b, kk) = arr(k, kk): Next
  21.           Else
  22.             a = a + 1
  23.             For kk = 1 To UBound(arr, 2): brr(a, kk) = arr(k, kk): Next
  24.           End If
  25.         Next
  26.         For k = i To j
  27.           For kk = 1 To UBound(arr, 2): arr(k, kk) = brr(k, kk): Next
  28.         Next
  29.         If a <> i - 1 Then Call dsort(arr, i, a, COL_2)
  30.         If b <> j + 1 Then Call dsort(arr, b, j, COL_2)
  31.         i = j: Exit For
  32.       End If
  33.   Next j, i
  34.   [a6].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  35. '---------------------------------------对条件3排序------------------------------------------
  36.        Application.AddCustomList ListArray:=Array("AAA", "BBB", "CCC")
  37.         .Sort Key1:=Range("C6"), Order1:=1, Header:=xlNo, OrderCustom:=Application.CustomListCount + 1
  38.         Application.DeleteCustomList ListNum:=Application.CustomListCount
  39. '--------------------------------------------------------------------------------------------
  40.         Application.AddCustomList ListArray:=Array("A", "C", "B")
  41.         .Sort Key1:=Range("E6"), Order1:=1, Header:=xlNo, OrderCustom:=Application.CustomListCount + 1
  42.         Application.DeleteCustomList ListNum:=Application.CustomListCount
  43.     End With
  44.    
  45.     Application.ScreenUpdating = True
  46. End Sub


  47. Function dsort(arr, first, last, key)
  48.   Dim i, j, k, t
  49.   For i = first To last - 1
  50.     For j = i + 1 To last
  51.       If arr(i, key) < arr(j, key) Then
  52.         For k = 1 To UBound(arr, 2)
  53.           t = arr(i, k): arr(i, k) = arr(j, k): arr(j, k) = t
  54.         Next
  55.       End If
  56.   Next j, i
  57. End Function
复制代码


test1.zip

16.63 KB, 下载次数: 21

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-30 10:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hugh1236 发表于 2018-7-30 09:47
大神非常感谢,不过还得麻烦下你,本来已经达到我设想的排序了,我们领导又加了1个条件,然后我又添加了 ...

A列不参与排序,改成这样就可以了
Range("B6:o" & Cells(Rows.Count, "d").End(xlUp).Row + 1)
[B6].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
嘻嘻
头像被屏蔽

TA的精华主题

TA的得分主题

发表于 2018-7-30 13:08 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-30 17:48 | 显示全部楼层
mikezhan 发表于 2018-7-30 13:08
Sub test()
Dim arr, brr, ar1, ar2, crr()
Set dic = CreateObject("scripting.dictionary")

感谢,不过我的表有变动了,可以看下回复中我提到的,如果可以的话,可以帮忙看看

TA的精华主题

TA的得分主题

发表于 2018-8-2 17:28 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-8-3 07:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
hugh1236 发表于 2018-7-30 09:47
大神非常感谢,不过还得麻烦下你,本来已经达到我设想的排序了,我们领导又加了1个条件,然后我又添加了 ...

'22楼附件

'感觉主条件只是一个摆设,也就是你给别人挖的坑,因为你要手工操作它

'可以继续加条件,如果多于3个我就加个条件数组来处理,就算100个条件也没有问题

'如果数据量超过1000行给你换个排序函数,不然效率将会变得很差

Option Explicit

Sub test()
  Dim arr, i, j, k, kk, a, b, brr
  With Sheets("sheet1")
    arr = .Range("a6:o" & .Cells(Rows.Count, "b").End(xlUp).Row + 1)
  End With
  brr = arr
  Call dsort(arr, 1, UBound(arr, 1) - 1, 5) '这行可以删除,就是你挖的坑
  For i = 1 To UBound(arr, 1) - 1
    For j = i To UBound(arr, 1) - 1
      If arr(j, 3) <> arr(j + 1, 3) Then
        Call dsort(arr, i, j, 3)
        a = i - 1: b = j + 1
        For k = i To j
          If arr(k, 6) = "甲" Then
            b = b - 1
            For kk = 1 To UBound(arr, 2): brr(b, kk) = arr(k, kk): Next
          Else
            a = a + 1
            For kk = 1 To UBound(arr, 2): brr(a, kk) = arr(k, kk): Next
          End If
        Next
        If a <> i - 1 Then Call dsort(brr, i, a, 13)
        If b <> j + 1 Then Call dsort(brr, b, j, 13)
        i = j: Exit For
      End If
  Next j, i
  With Sheets("sheet3").[a6]
    .Resize(Rows.Count - 5, UBound(arr, 2)).ClearContents
    .Resize(UBound(arr, 1), UBound(arr, 2)) = brr
  End With
End Sub

Function dsort(arr, first, last, key)
  Dim i, j, k, t
  For i = first To last - 1
    For j = i + 1 To last
      If arr(i, key) < arr(j, key) Then
        For k = 1 To UBound(arr, 2)
          t = arr(i, k): arr(i, k) = arr(j, k): arr(j, k) = t
        Next
      End If
  Next j, i
End Function

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-6 09:55 | 显示全部楼层
一把小刀闯天下 发表于 2018-8-3 07:20
'22楼附件

'感觉主条件只是一个摆设,也就是你给别人挖的坑,因为你要手工操作它


还是不行,我感觉主要的排序是《条件、条件3、条件2》,条件1中就是有个特例,为"甲"的排在后面。
下表是我想达到的排序,手动调的,条件2没显示出来,还是从大到小的顺序。我手动做的话,是先将“条件、条件3、条件2”按自定义排序后将“条件1”为“甲”的剪切放在“条件”为“A”的最后。
大神你看下,能不能靠代码一步到位,感谢!
[tr] [/tr]
条件3内容2条件条件1
 
AAA
数据20
A
AAA
数据6
A
AAA
数据27
A
AAA
数据15
A
AAA
数据21
A
BBB
数据5
A
BBB
数据22
A
CCC
数据14
A
AAA
数据24
A
AAA
数据16
A
AAA
数据28
A
BBB
数据18
A
CCC
数据25
A
AAA
数据10
C
AAA
数据4
C
AAA
数据9
C
AAA
数据7
C
BBB
数据3
C
CCC
数据8
C
AAA
数据23
B
AAA
数据19
B
AAA
数据2
B
AAA
数据11
B
AAA
数据17
B
AAA
数据13
B
BBB
数据12
B
BBB
数据26
B
CCC
数据1
B

TA的精华主题

TA的得分主题

发表于 2018-8-6 10:27 | 显示全部楼层
hugh1236 发表于 2018-8-6 09:55
还是不行,我感觉主要的排序是《条件、条件3、条件2》,条件1中就是有个特例,为"甲"的排在后面。
下 ...

又进入了看不懂模式,咱直接投降算了

一个文字题但我就是理解不了,你还是问问其他老师吧,我相信你自己肯定知道要想解决什么问题
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-11 17:01 , Processed in 0.028402 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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