在Excel中按组分组数据
所以,我环顾四周,试图自己解决这个问题。 目前这不是一个绝对重要的问题,我只想知道是否可以做到。
所以我们假设我有一个列表,里面有一些数据
Date Location 01/24/14 H-12 01/25/14 BB-44 01/30/14 G-12 01/29/14 7A-55 01/28/14 NN-15 01/24/14 GG-47
我想要的是能够按位置sorting数据,但我不希望它是一般的方式,否则我会以7A-55,BB-44,G-12,H-12, NN-15。 我想要对数据进行sorting,以便将双字母和单字母sorting在一起。 EG,一旦所有东西都被分类,它应该是G-12,H-12,BB-44,NN-15,7A-55。
我试着创build一个自定义列表sorting,但它不起作用。 意图的方式。 我试过的自定义列表是AZ,AA-ZZ,7A(项目已列出,但是为了节省空间,我就这样写了)。
就像我说的,如果不能做到这一点,这不是一个特别大的交易,只是让它变得容易一些。
编辑1这是我想成为输出
Date Location 01/30/12 G-12 01/24/14 H-12 01/25/14 BB-44 01/24/14 GG-47 01/28/14 NN-15 01/29/14 7A-55
编辑
所有这些工作在我想要的问候,但如果我不得不select一个最喜欢的,这将是基数36号码转换之一。 这是一个真正的开箱即用的思想,我的math极客赞赏它。 感谢大家!
那么它的工作,但是有点复杂,所以只是为了好玩:这个UDF返回一个值,可以用作sorting键。 它将代码转换为四位数的基数36位数字,即使用AZ和0-9作为符号(如hex使用0-9和AF)。 为了得到你想要的结果,我从字面上把这些符号按顺序放在首位(所以“A”= 0和“0”= 26)。 (缺less的“数字”用零填充,在这种情况下是“A”)
有用 ;)
Public Function Base36Transform(r As Range) As Long Dim s As String, c As String Dim v Dim i As Integer Dim rv As Long v = Split(r.Text, "-") s1 = v(0) s2 = v(1) s = Right("A" & s1, 2) & Right("A" & s2, 2) rv = 0 For i = 1 To Len(s) c = Mid(s, Len(s) - i + 1, 1) If c Like "#" Then rv = rv + (Val(c) + 26) * (36 ^ (i - 1)) Else ' c is like "[AZ]" rv = rv + (Asc(c) - Asc("A")) * (36 ^ (i - 1)) End If Next Base36Transform = rv End Function
sorting往往是一个非常有创意的过程。 VBA可以缓解这个过程,但是稍微扩展一下数据也是可以的。
查看我的结果:
我做的方法是通过获取每个string的长度,以保证安全。 这是通过简单地=LEN(B2)
,拖下来得到的。
然后我检查它是否以7
开头。 如果是,则分配1
,否则保持为0
。 我用这个公式: =(LEFT(B2,1)="7")*1
,拖下去。
现在,我的自定义sorting是这样的:
现在我可能在这里弄错了一些东西,或者我甚至可以通过Length
列来做一些矫枉过正的事情。 然而,这个逻辑几乎是你想要的。
希望这有助于某种方式! 让我们知道 🙂
我在这里有点懒,假设你的数据位于列A,B。 您可能需要调整您的范围或列表的起始点。 但是这是代码:
Sub sortttttt() Dim rng As Range Dim i As Integer Range("B2").Activate Do While Not IsEmpty(ActiveCell) ActiveCell.Value = Len(ActiveCell.Value) & ActiveCell.Value ActiveCell.Offset(1, 0).Activate Loop Set rng = Range("A1:B6") rng.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlYes Range("B2").Activate Do While Not IsEmpty(ActiveCell) ActiveCell.Value = Right(ActiveCell.Value, Len(ActiveCell.Value) - 1) ActiveCell.Offset(1, 0).Activate Loop End Sub
假设您的数据在列B:C中带有行1中的标签并且没有中间空行,请添加一个列:
=IF(ISNUMBER(VALUE(LEFT(C2))),3,IF(FIND("-",C2)>2,2,1))
在D1中被复制下来,以便在添加的列的sorting升序内按照升序位置进行sorting。