Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2375|回复: 7

[已解决]求助高手:高难VBA字符串二步排序?

[复制链接]
发表于 2018-11-2 14:36 | 显示全部楼层 |阅读模式
99.jpg
最佳答案
2018-11-8 10:44
基本思想差不多,都用了辅助列,故原表B、C列不能有内容:
Sub test()
Dim ar1(), ar2()
ar1 = [a2:a8].Value
ReDim ar2(1 To UBound(ar1), 1 To 2)
For i% = 1 To UBound(ar1)
    ar2(i, 1) = Val(Split(ar1(i, 1), "+")(1))
    ar2(i, 2) = Val(Split(ar1(i, 1), "-")(1))
Next
[b2].Resize(i - 1, 2) = ar2
[A2].Resize(i - 1, 3).Sort [c1], xlAscending, [b1], , xlAscending
[b2].Resize(i - 1, 2).Clear
End Sub

字符串组合排序.rar

8.58 KB, 下载次数: 8

求助高手:高难VBA字符串二步排序?

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2018-11-7 19:38 | 显示全部楼层
  1. Sub 二次排序()
  2.     Dim rw%
  3.     rw = [a2].End(4).Row
  4.         Range("B2").Select
  5.         ActiveCell.FormulaR1C1 = _
  6.             "=MID(RC[-1],FIND(""-"",RC[-1])+1,FIND(""Q"",RC[-1])-FIND(""-"",RC[-1])-1)"
  7.         Range("C2").Select
  8.         ActiveCell.FormulaR1C1 = _
  9.             "=MID(RC[-2],FIND(""+"",RC[-2])+1,FIND(""/"",RC[-2])-FIND(""+"",RC[-2])-1)"
  10.             
  11.         Range("B2:C2").Select
  12.         Selection.AutoFill Destination:=Range("B2:C" & rw), Type:=xlFillDefault
  13.         
  14.     Range("A2:C" & rw).Select
  15.     ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("B2:B" & rw), _
  16.         SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
  17.         xlSortTextAsNumbers
  18.     ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("C2:C" & rw), _
  19.         SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
  20.         xlSortTextAsNumbers
  21.         
  22.     With ActiveWorkbook.Worksheets("Sheet1").Sort
  23.         .SetRange Range("A2:C" & rw)
  24.         .Header = xlGuess
  25.         .MatchCase = False
  26.         .Orientation = xlTopToBottom
  27.         .SortMethod = xlPinYin
  28.         .Apply
  29.     End With
  30.    
  31.     Range("b2:C" & rw).ClearContents
  32.     [c2].Select
  33.     MsgBox "排序完成!"
  34. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
zwj8859 + 1 我和小伙伴都惊呆了

查看全部评分

回复

使用道具 举报

发表于 2018-11-8 08:28 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2018-11-8 10:23 | 显示全部楼层
谢谢你!程序内容那么多,难度肯定大,贴子公布很久了,没有一点消息,我以为没希望了。不过今天打开,我真的很意外的。再次谢谢高手老师!
回复

使用道具 举报

发表于 2018-11-8 10:44 | 显示全部楼层    本楼为最佳答案   
基本思想差不多,都用了辅助列,故原表B、C列不能有内容:
Sub test()
Dim ar1(), ar2()
ar1 = [a2:a8].Value
ReDim ar2(1 To UBound(ar1), 1 To 2)
For i% = 1 To UBound(ar1)
    ar2(i, 1) = Val(Split(ar1(i, 1), "+")(1))
    ar2(i, 2) = Val(Split(ar1(i, 1), "-")(1))
Next
[b2].Resize(i - 1, 2) = ar2
[A2].Resize(i - 1, 3).Sort [c1], xlAscending, [b1], , xlAscending
[b2].Resize(i - 1, 2).Clear
End Sub

评分

参与人数 2 +22 收起 理由
ppp710715 + 21 用数组简单明,学习了。
zwj8859 + 1 我和小伙伴都惊呆了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2018-11-8 11:29 | 显示全部楼层
上清宫主 发表于 2018-11-8 10:44
基本思想差不多,都用了辅助列,故原表B、C列不能有内容:
Sub test()
Dim ar1(), ar2()

用数组简单明了,高手老师谢谢!!!
回复

使用道具 举报

 楼主| 发表于 2018-11-8 21:17 | 显示全部楼层
上清宫主 发表于 2018-11-8 10:44
基本思想差不多,都用了辅助列,故原表B、C列不能有内容:
Sub test()
Dim ar1(), ar2()

ar1 = [a2:a8].Value能否改成“A列的非空单元格”?不知怎么改?再麻烦老师!

回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-6-6 01:54 , Processed in 0.370798 second(s), 16 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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