ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

单元格内数据是逗号隔开的,宏如何实现给单元格内数据由小到大排序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-4-23 17:07 | 显示全部楼层
适合二楼
  1. Function F(s)
  2. If InStr(s, ",") = 0 Then F = s: Exit Function
  3. Dim a(100)
  4. For Each c In Split(s, ",")
  5.   For i = 2 To Len(c)
  6.     If Mid(c, i, 1) Like "#" Then Exit For
  7.   Next
  8.     a(Val(Mid(c, i))) = "," & c
  9. Next
  10. F = Mid(Join(a, ""), 2)
  11. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2015-4-23 17:21 | 显示全部楼层
另一种方法:
  1. Private Sub CommandButton1_Click()
  2.     [B:B].ClearContents
  3.     For Each c In Range([A1], Cells(Rows.Count, 1).End(xlUp))
  4.         s = Trim(c.Value)
  5.         If Len(s) > 0 Then
  6.             x = Split(s, ",")
  7.             If UBound(x) = LBound(x) Then
  8.                 c.Offset(, 1) = s
  9.             Else
  10.                 n = 1: For i = 1 To 9
  11.                     If (Asc(Mid(s, i, 1)) < 48) Or (Asc(Mid(s, i, 1)) > 57) Then n = n + 1 Else Exit For
  12.                 Next
  13.                 k = 0: For i = LBound(x) To UBound(x): k = k + 1
  14.                     ss = Replace("small({" & Replace(s, Left(s, n - 1), "") & "},KKK)", "KKK", k)
  15.                     x(i) = Left(s, n - 1) & Evaluate(ss)
  16.                 Next
  17.                 c.Offset(, 1) = Join(x, ",")
  18.             End If
  19.         End If
  20.     Next
  21. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-4-23 17:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jsxjd 发表于 2015-4-23 16:48

头标识需要识别!

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-16 10:46 | 显示全部楼层
以上代码在1个字母情况下没问题,但数据中存在多个字母时就出现问题:
比如单元格中数据为:RE,LN,RA,就出现无法排序的问题。请问如何解决?

TA的精华主题

TA的得分主题

发表于 2015-5-16 11:05 | 显示全部楼层
  1. Sub test()
  2. '需要安装ACTIVERUBY ,下载地址 http://www.artonx.org/data/asr/Ruby-2.1.1.msi
  3. Set ojs = CreateObject("scriptcontrol"): ojs.Language = "rubyscript"
  4. ojs.eval ("def aa(aa) $aa=aa.flatten.compact end")
  5. y = ojs.Run("aa", Range("A1", [a65536].End(3)).Value)
  6. y = ojs.eval("$aa.map{|s|s.split(',').sort_by{|i|i.gsub(/\d+/) {|s| '%08d' % s.to_i }}.join(',')}.zip")
  7. [b1].Resize(UBound(y) + 1) = y
  8. 'Stop
  9. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2015-5-17 15:44 | 显示全部楼层
arcticstar 发表于 2015-5-16 10:46
以上代码在1个字母情况下没问题,但数据中存在多个字母时就出现问题:
比如单元格中数据为:RE,LN,RA,就 ...
  1. Private Sub Cmm()
  2.     [B:B].ClearContents
  3.     Dim a(), b()
  4.        Set d = CreateObject("scripting.dictionary")
  5.     For Each c In Range([A1], Cells(Rows.Count, 1).End(xlUp))
  6.            s = Trim(c.Value)
  7.         If Len(s) > 0 Then
  8.             x = Split(s, ",")
  9.           If UBound(x) = LBound(x) Then
  10.                 c.Offset(, 1) = s
  11.           Else
  12.                n = 0
  13.             For j = LBound(x) To UBound(x)
  14.               For i = 1 To Len(x(j))
  15.                 If (Asc(Mid(x(j), i, 1)) < 48) Or (Asc(Mid(x(j), i, 1)) > 57) Then n = n + 1 Else Exit For
  16.               Next
  17.                    ReDim Preserve a(0 To j)
  18.                    ReDim Preserve b(0 To j)
  19.                    a(j) = Mid(x(j), 1, n)
  20.                    b(j) = CInt(Mid(x(j), n + 1))
  21.                    d(b(j)) = a(j)
  22.                    n = 0
  23.              Next
  24.                    For ii = 0 To UBound(x)
  25.                      For jj = ii + 1 To UBound(x)
  26.                        If b(ii) > b(jj) Then
  27.                           TEMP = b(jj)
  28.                           b(jj) = b(ii)
  29.                           b(ii) = TEMP
  30.                        End If
  31.                      Next
  32.                    Next
  33.                     TEMP = ""
  34.                     s = ""
  35.                     kk = kk + 1
  36.                  For i = LBound(b) To UBound(b)
  37.                    If d.Exists(b(i)) Then s = s & d(b(i)) & b(i) & ","
  38.                  Next
  39.                    d.RemoveAll
  40.                    Erase a, b
  41.                    c.Offset(, 1) = s
  42.           End If
  43.         End If
  44.     Next
  45. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-18 15:58 | 显示全部楼层

问题依旧,还是会报错,请测试附件
工作簿1.zip (7.23 KB, 下载次数: 21)


TA的精华主题

TA的得分主题

发表于 2015-5-18 16:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
arcticstar 发表于 2015-5-18 15:58
问题依旧,还是会报错,请测试附件

本人的版本为2003,无法测试您的附件,请上
版本为2003的附件。

TA的精华主题

TA的得分主题

发表于 2015-5-18 17:33 | 显示全部楼层
好奇心 发表于 2015-5-18 16:08
本人的版本为2003,无法测试您的附件,请上
版本为2003的附件。

用正则处理,先按字母、后按数字排序

工作簿1 (2).rar

8.73 KB, 下载次数: 30

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-5-23 13:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
好奇心 发表于 2015-5-18 16:08
本人的版本为2003,无法测试您的附件,请上
版本为2003的附件。

附件为2003版,请帮解决,谢谢!
工作簿1.rar (4.26 KB, 下载次数: 16)


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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