ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2015-1-4 15:16 | 显示全部楼层
rzqf 发表于 2015-1-4 15:09
你这个公式实现不了,有很多错误,而且要插入一行的话,就错了

啊哈哈哈,不够细致哈,感谢指正,再做修正....

TA的精华主题

TA的得分主题

发表于 2015-1-4 15:32 | 显示全部楼层
rzqf 发表于 2015-1-4 15:09
你这个公式实现不了,有很多错误,而且要插入一行的话,就错了

这下全对了,可以跟据最大-的数量来相应扩展公式中的常量数组和取数量
插入行的话要把范围改为=INDIRECT("A1:A"&COUNTA(A:A))的写法,纯属娱乐:D 排序.rar (30.87 KB, 下载次数: 22)

TA的精华主题

TA的得分主题

发表于 2015-1-4 18:33 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 香川群子 于 2015-1-4 18:52 编辑
aoe1981 发表于 2015-1-3 16:06
其实,我在一开始也想弄一个固定层数、固定最大编码的,因为完全可以预设为足够大,因为实际中往往用不了 ...

老老实实的代码:
  1. Sub test()
  2.     Dim ar, i&, j&, m&, n&, s, t0$, t$, tms#
  3.     tms = Timer
  4.    
  5.     m = [a1].End(4).Row 'A列最大行数m
  6.     ar = [a1].Resize(m)    'A列待排序数据读入数组ar
  7.    
  8.     t0 = "s" & String(4 * 10, "0") '建立排序字符串模板= 4位数*10级
  9.     For i = 1 To m '遍历各行
  10.         s = Split(ar(i, 1), "-") '按[-]拆分
  11.         t = t0 '读取模板
  12.         For j = 0 To UBound(s) '遍历按[-]拆分后的各级
  13.             n = Len(s(j)) '该级位数n
  14.             Mid(t, j * 4 + 6 - n, n) = s(j) '模板更新为对应的排序结果字符串
  15.         Next
  16.         ar(i, 1) = t '写入排序结果字符串
  17.     Next
  18.     [b1].Resize(m) = ar '在B列写入排序结果字符串
  19.    
  20.     [a1].Resize(m, 2).Sort [b1], 1, , , , , , 2 '使用工作表排序方法按B列结果排序
  21.     [b1].Resize(m) = ""    '清空B列
  22.     MsgBox Format(Timer - tms, " 0.000s")
  23. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-1-4 18:45 | 显示全部楼层
香川群子 发表于 2015-1-4 18:33
老老实实的代码:

一开始试了一下,快得不得了,一眨眼,咦,好了……给我惊讶的……

粗粗研究了下:
1.读取格式模板算是神来之笔,既巧妙又快速:
t0 = "s" & String(4 * 10, "0")
t = t0
Mid(t, j * 4 + 6 - n, n) = s(j)

2.利用了b列和工作表排序方法:
[a1].Resize(m, 2).Sort [b1], 1, , , , , , 2

TA的精华主题

TA的得分主题

发表于 2015-1-4 18:57 | 显示全部楼层
aoe1981 发表于 2015-1-4 18:45
一开始试了一下,快得不得了,一眨眼,咦,好了……给我惊讶的……

粗粗研究了下:

速度还可以更快一些……不要使用Split,完全用自己的代码……用Instr……Do循环:
  1. Sub test2()
  2.     Dim ar, i&, j&, l&, m&, n&, s$, t0$, t$, tms#
  3.     tms = Timer
  4.    
  5.     m = [a1].End(4).Row
  6.     ar = [a1].Resize(m)
  7.    
  8.     t0 = "s" & String(4 * 10, "0")
  9.     For i = 1 To m
  10.         t = t0
  11.         s = ar(i, 1)
  12.         j = 0: l = 1
  13.         Do
  14.             n = InStr(l, s, "-")
  15.             If n Then
  16.                 Mid(t, j * 4 + 6 - n + l, n - l) = Mid(s, l, n - l)
  17.                 j = j + 1: l = n + 1
  18.             End If
  19.         Loop Until n = 0
  20.         Mid(t, j * 4 + 5 - Len(s) + l, Len(s) + 1 - l) = Mid(s, l, Len(s) + 1 - l)
  21.         ar(i, 1) = t
  22.     Next   
  23.     [b1].Resize(m) = ar
  24.    
  25.     [a1].Resize(m, 2).Sort [b1], 1, , , , , , 2
  26.     [b1].Resize(m) = ""
  27.     MsgBox Format(Timer - tms, " 0.000s")
  28. End Sub
复制代码

点评

Mid(t, j * 4 + 6 - n + l, n - l) = Mid(s, l, n - l)  mid被您用得出神入化了……  发表于 2015-1-4 19:48

TA的精华主题

TA的得分主题

发表于 2015-1-4 19:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个帖子引出好多高手啊,慢慢学习。

TA的精华主题

TA的得分主题

发表于 2015-1-4 19:11 | 显示全部楼层
香川群子 发表于 2015-1-4 18:57
速度还可以更快一些……不要使用Split,完全用自己的代码……用Instr……Do循环:

http://club.excelhome.net/thread-1176723-1-2.html

大神出现了,等了很久了。

TA的精华主题

TA的得分主题

发表于 2015-1-4 19:20 | 显示全部楼层
没正规学习编程,请大神:下面这句语法是什么意思?
Mid(t, j * 4 + 6 - n, n) = s(j)

TA的精华主题

TA的得分主题

发表于 2015-1-4 19:22 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-1-4 20:10 | 显示全部楼层
香川群子 发表于 2015-1-4 18:57
速度还可以更快一些……不要使用Split,完全用自己的代码……用Instr……Do循环:

能不能用您自己的语言介绍下instr与find函数的区别……

对instr一直认识不深入,很少使用……

感觉这二者有些共同点吧,似乎都能返回某字符在另一字符串中出现的位置……

希望有更深一些的认识……
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 00:11 , Processed in 0.045012 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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