在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。