ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-26 16:44 | 显示全部楼层

谢谢!这个表上可以运行。不过我实际需要用到的表列数很多,这两列的位置也不是在前面,并且不是相邻的两列,前面几行还有标题,不知道要怎么修改代码。请问这个要怎么改呢?需要我再做个文件吗?

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-7-26 18:40 | 显示全部楼层
hugh1236 发表于 2018-7-26 16:44
谢谢!这个表上可以运行。不过我实际需要用到的表列数很多,这两列的位置也不是在前面,并且不是相邻的两 ...

'可以不上附件,不过自己要会修改,需修改的地方都做了注释

'前面代码的效率极差,你的数据量可能较大所以给你重写了,效率优先

'当然满意要来朵小花的哦

Option Explicit

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

Sub test()
  Dim i, j, pos(1), arr, brr
  arr = Sheets("sheet1").[a1].CurrentRegion '源数据工作表及位置
  brr = arr: pos(0) = TITLENUM: pos(1) = UBound(arr, 1) + 1
  For i = TITLENUM + 1 To UBound(arr, 1)
    If arr(i, COL_1) = FINDSTR Then
      pos(1) = pos(1) - 1
      For j = 1 To UBound(arr, 2): brr(pos(1), j) = arr(i, j): Next
    Else
      pos(0) = pos(0) + 1
      For j = 1 To UBound(arr, 2): brr(pos(0), j) = arr(i, j): Next
    End If
  Next
  Call msort(brr, arr, TITLENUM + 1, pos(0), 1, UBound(brr, 2), COL_2)
  Call msort(brr, arr, pos(1), UBound(brr, 1), 1, UBound(brr, 2), COL_2)
  Sheets("sheet2").[a1].Resize(UBound(brr, 1), UBound(brr, 2)) = brr '输出工作表及位置
End Sub

Function msort(arr, temp, first, last, left, right, key)
  Dim i As Long, j As Long, k As Long, kk As Long, mid As Long
  If first <> last Then
    mid = Int((first + last) / 2)
    msort arr, temp, first, mid, left, right, key
    msort arr, temp, mid + 1, last, left, right, key
    i = first: j = mid + 1: k = first
    While i <= mid And j <= last
      If arr(i, key) >= arr(j, key) Then
        For kk = left To right: temp(k, kk) = arr(i, kk): Next
        k = k + 1: i = i + 1
      Else
        For kk = left To right: temp(k, kk) = arr(j, kk): Next
        k = k + 1: j = j + 1
      End If
    Wend
    While i <= mid
      For kk = left To right: temp(k, kk) = arr(i, kk): Next
      k = k + 1: i = i + 1
    Wend
    While j <= last
      For kk = left To right: temp(k, kk) = arr(j, kk): Next
      k = k + 1: j = j + 1
    Wend
    For i = first To last
      For j = left To right
        arr(i, j) = temp(i, j)
    Next j, i
  End If
End Function

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-7-26 21:38 | 显示全部楼层
hugh1236 发表于 2018-7-26 12:20
能具体点吗?我属小白系列

你的模拟结果 与 你定义的 排序规则 不相符!!!为了对比 我把排序结果放在 H1开始的单元格!!!
  1. Sub main()
  2.     Dim arr, j$
  3.     arr = [a1].CurrentRegion.Value
  4.     j = "o={'甲':0};function g(k){return o.hasOwnProperty(k)?o[k]:1;};"
  5.     j = j & "function q(x,y){return (x[0]==y[0])?(y[1]-x[1]):(g(y[0])-g(x[0]))};"
  6.     Call mySort(arr, j)
  7.     Range("h1").Resize(UBound(arr), UBound(arr, 2)) = arr
  8. End Sub
  9. Sub mySort(ByRef a, ByVal p As String)
  10.     Dim js As Object, i&, l1&, l2&, u1&, u2&, s$, sr$, j&
  11.     Set js = CreateObject("MSScriptControl.ScriptControl")
  12.     js.Language = "JavaScript"
  13.     l1 = LBound(a) + 1: l2 = LBound(a, 2): u1 = UBound(a): u2 = UBound(a, 2)
  14.     For i = l1 To u1
  15.         For j = l2 To u2
  16.             s = s & "," & "'" & a(i, j) & "'"
  17.         Next
  18.         sr = sr & "," & "[" & Mid(s, 2) & "]": s = Empty
  19.     Next
  20.     sr = "[" & Mid(sr, 2) & "]"
  21.     js.AddCode "a=" & sr & ";" & p & "a.sort(q);"
  22.     For i = l1 To u1
  23.         For j = l2 To u2
  24.             a(i, j) = js.eval("a[" & i - l1 & "][" & j - l2 & "]")
  25.         Next
  26.     Next
  27. End Sub
复制代码

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-7-26 22:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习了!!!

TA的精华主题

TA的得分主题

发表于 2018-7-27 00:02 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-27 11:36 | 显示全部楼层
本帖最后由 hugh1236 于 2018-7-27 11:39 编辑
一把小刀闯天下 发表于 2018-7-26 18:40
'可以不上附件,不过自己要会修改,需修改的地方都做了注释

'前面代码的效率极差,你的数据量可能较大 ...

非常感谢!不过用到我需要的表中还是有问题,请帮忙看下附件,新加了一个条件排序,运行代码没有达到我想要的排序(实际我要用的表还有几个条件需要排序,有层级)
我还加了一个我之前排序用的按钮,只差“条件为A”的数据中“甲”排在“条件A”的后面,“条件2”还是降序排列。还有,A列可不可以不列入排序范围,因为我本身的表中套用的公式。
还请再帮忙看下,谢谢!

test1.zip

17.55 KB, 下载次数: 13

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-27 11:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一把小刀闯天下 发表于 2018-7-26 18:40
'可以不上附件,不过自己要会修改,需修改的地方都做了注释

'前面代码的效率极差,你的数据量可能较大 ...
一把小刀闯天下 发表于 2018-7-26 18:40
'可以不上附件,不过自己要会修改,需修改的地方都做了注释

'前面代码的效率极差,你的数据量可能较大 ...

非常感谢!不过用到我需要的表中还是有问题,请帮忙看下附件,新加了一个条件排序,运行代码没有达到我想要的排序(实际我要用的表还有几个条件需要排序,有层级)
我还加了一个我之前排序用的按钮,只差“条件为A”的数据中“甲”排在“条件为A”的后面,“条件2”还是降序排列。
还有,可不可以A列不参加排序,因为我表中会有公式。
还请再帮忙看下,谢谢!

test1.zip

17.55 KB, 下载次数: 5

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-27 11:56 | 显示全部楼层
duquancai 发表于 2018-7-26 21:38
你的模拟结果 与 你定义的 排序规则 不相符!!!为了对比 我把排序结果放在 H1开始的单元格!!!

非常感谢!我可能没说清楚,条件1中,为甲的放最后,条件2用降序,最终要达到的效果就是表2的样子,我实际要用的表列和行都不止这些,而且有多个条件排序。

TA的精华主题

TA的得分主题

发表于 2018-7-27 13:11 | 显示全部楼层
hugh1236 发表于 2018-7-27 11:42
非常感谢!不过用到我需要的表中还是有问题,请帮忙看下附件,新加了一个条件排序,运行代码没有达到我 ...

主条件列与结果列是什么对于关系?我没找出规律,应该是按字符串排序,但也不像啊,能否解释一下

"实际我要用的表还有几个条件需要排序,有层级",你的意思是先上个别人看不懂的附件,然后再追加条件是这个意思吗?
条件
结果
B
A
B
A
C
A
C
A
B
A
A
B
C
B
C
B
C
A
C
C
B
B
B
C
B
B
A
C
A
B
A
C
B
B
A
A
B
C
A
B
A
A
A
C
B
B
A
A
A
A


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-27 15:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一把小刀闯天下 发表于 2018-7-27 13:11
主条件列与结果列是什么对于关系?我没找出规律,应该是按字符串排序,但也不像啊,能否解释一下

"实 ...

大佬不好意思,新手上路,想法太简单了。而且这表一直被要求改这改那,这个又是涉密的文件,只好自己仿照需求表模拟做的T_T
条件、条件1都为中文,就是我所有数据的一个分类名称(条件2为数据),条件排序>条件1排序。
例如条件中的“A、B、C”按我的想法是可以根据自己的设置排成“A、C、B”或其它(随时在变动),这样条件为A的数据都在一起的,再在A中有甲的数据放在A的最后,B、C没有甲,其余乙、丙···不排序,最后有个条件2是按数据的大小,从大到小
基本上就是满足'条件'A并且'条件1'中乙丙的,'条件2'大的在前面;之后是A中的甲,一样'条件2'从大到小;再是C的可以不考虑'条件1'了,直接'条件2'从大到小,B同C
还望大佬帮忙,谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-11 16:43 , Processed in 0.028143 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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