ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

都来看看这个排序怎么实现,再来看看单位前面的量怎么提取

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2015-1-3 00:38 | 显示全部楼层
总体感觉代码效率太低,原因可能有二:
一是如果编码有几层,就反复几次使用“冒泡排序”遍历一次,“冒泡排序”本就效率不高,且重复几次的话,更低下了,被放大了……
二是在循环内部存在文本连接符&的运算,据说这个运算本身是很慢的,很耗时的……

进一步的改进恐怕得香川这样的大师来做了,香川的“希尔排序”、“快速排序”,总是感觉太复杂,难以熟稔运用……

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-3 07:22 | 显示全部楼层
为什么都不能将“A”列的数值按照“B”列的顺序排列呢

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-3 07:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
aoe1981 发表于 2015-1-3 00:27
根据以下指点:
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1176846&pid=8024 ...

这些都不能将“A”列的数值按照“B”列的顺序排列,应该是1-1, 1-2, 1-3的顺序才可以的

点评

不好意思,太主观了,没能仔细深入地研究您的B列特点……  发表于 2015-1-3 10:00

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-3 07:52 | 显示全部楼层
终于成功了,谢谢大家,复制代码上来,和大家一起研究
Sub mesort()
Application.ScreenUpdating = False
Dim RegEx, rng, i, t
Sheets("1").Activate
Set rng = Range("c2", [c65536].End(3))
Set RegEx = CreateObject("VBSCRIPT.REGEXP")
For i = 2 To [c65536].End(3).Row
   RegEx.Global = True
   RegEx.Pattern = "[^0-9/^-]"
   t = RegEx.Replace(Cells(i, 3), "") & Chr(9)
   Cells(i, 3) = Format(Split(t, "-")(0), "000") & Format(Split(t, "-")(1), "000") & "&" & Cells(i, 3)
Next
rng.Sort Key1:=[c2], Order1:=1, Header:=xlNo
For i = 2 To [c65536].End(3).Row
    Cells(i, 3) = Split(Cells(i, 3), "&")(1)
Next
Set RegEx = Nothing
Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

发表于 2015-1-3 09:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
1.gif

点评

这个分列的办法确实用得好,能用基本功能实现,就用基本功能……  发表于 2015-1-3 09:53

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-1-3 09:30 | 显示全部楼层
请看附件                        

TA的精华主题

TA的得分主题

发表于 2015-1-3 09:32 | 显示全部楼层
0.02秒

按B列排序.zip (30.49 KB, 下载次数: 48)

点评

效率很高,但是任意修改层数、每层位数后,结果会出错,可能是依据楼主给出的数据吧……  发表于 2015-1-3 11:26

TA的精华主题

TA的得分主题

发表于 2015-1-3 11:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
修改后的代码如下:
  1. Option Explicit
  2. Public Sub PaiXu1()
  3. Dim arr, n&, cs_max%, i&, j&, j1%, k&, k1%, m%, s1, s2, gd, jg, t#
  4.     t = Timer
  5.     n = Cells(Rows.Count, 1).End(xlUp).Row
  6.     If n > 1 Then arr = Range("a1:a" & n).Value Else ReDim arr(1 To 1, 1 To 1): arr(1, 1) = Range("a1").Value
  7.     jg = arr '记录原始结果
  8.    
  9.    
  10.     ReDim cs(1 To n): cs_max = 0
  11.     For i = 1 To n '自动检测最大层数
  12.         cs(i) = Len(arr(i, 1)) - Len(Replace(arr(i, 1), "-", "")) + 1
  13.         If cs_max < cs(i) Then cs_max = cs(i)
  14.     Next i
  15.    
  16.    
  17.     For i = 1 To n '统一编码层数
  18.         m = cs_max - cs(i)
  19.         arr(i, 1) = arr(i, 1) & String(m, "-")
  20.     Next i
  21.    
  22.    
  23.     ReDim ws_max(1 To cs_max), ws(1 To cs_max), brr(1 To n) '记录每一层位数最大值
  24.     For i = 1 To cs_max '每一层位数最大值初始化
  25.         ws_max(i) = 0
  26.     Next i
  27.     For i = 1 To n
  28.         brr(i) = Split(arr(i, 1), "-")
  29.         For j = 1 To cs_max
  30.             ws(j) = Len(brr(i)(j - 1))
  31.             If ws(j) > ws_max(j) Then ws_max(j) = ws(j)
  32.         Next j
  33.     Next i
  34.    
  35.    
  36.     ReDim gsf$(1 To cs_max), arr(1 To n, 1 To 1) '生成格式符、清空arr数组
  37.     For i = 1 To cs_max
  38.         gsf(i) = String(ws_max(i), "0")
  39.     Next i
  40.     For i = 1 To n '统一每层位数并重新连接
  41.         For j = 1 To cs_max
  42.             arr(i, 1) = arr(i, 1) & Format(Val(brr(i)(j - 1)), gsf(j))
  43.         Next j
  44.     Next i
  45.    
  46.    
  47.     For i = 1 To n - 1 '冒泡排序,一步到位
  48.         For j = i + 1 To n
  49.             If Val(arr(j, 1)) < Val(arr(i, 1)) Then
  50.                 gd = jg(j, 1): jg(j, 1) = jg(i, 1): jg(i, 1) = gd
  51.                 gd = arr(j, 1): arr(j, 1) = arr(i, 1): arr(i, 1) = gd
  52.             End If
  53.         Next j
  54.     Next i
  55.     Range("c:c").ClearContents: Range("c1").Resize(n) = jg: Range("d1") = "用时:" & Format(Timer - t, "0.0000") & "秒。"
  56. End Sub
复制代码
可以自动检测层数,及每层位数,适应性强,效率比前次排序高。

TA的精华主题

TA的得分主题

发表于 2015-1-3 11:12 | 显示全部楼层
新的附件如下:
号导入(aoe1981)含两种排序结果.rar (24.08 KB, 下载次数: 70)

效果图一角:
360截图-6140854.jpg

TA的精华主题

TA的得分主题

发表于 2015-1-3 11:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个排序处理比前面简单了,只需做一次冒泡排序即可……

任意修改层数、每层位数均不受影响,一组测试图如下:
360截图-6294125.jpg
360截图-6308883.jpg

360截图-6325325.jpg
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 02:13 , Processed in 0.043925 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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