所以,我环顾四周,试图自己解决这个问题。这不是一个绝对至关重要的问题,我只是想知道是否可以做到。
所以,假设我有一个列表,其中包含一些看起来像
的数据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
我想要的是能够按位置对数据进行排序,但我不希望它是一般方式,否则我最终会得到7A-55,BB-44,G-12,H -12,NN-15。我希望对数据进行排序,以便将双字母和单个字母排序在一起。例如。一切都已经分类,它应该是G-12,H-12,BB-44,NN-15,7A-55。
我尝试过创建自定义列表排序,但它不起作用。预期的方式。我尝试过的自定义列表是A-Z,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
所有这些都符合我的意愿,尽管如果我必须选择一个最喜欢的,它将是基数36号转换之一。这是一些真正开箱即用的想法,而我的数学极客对此表示赞赏。谢谢大家!
答案 0 :(得分:1)
排序通常是一个非常有创意的过程。 VBA可以简化流程,但是数据的一点扩展也可以正常工作。
查看我的结果:
我这样做的方法是获取每个字符串的长度,只是为了安全。这是通过简单地拖动=LEN(B2)
得到的。
然后我检查它是否以7
开头。如果是,请指定1
,否则请保留0
。我使用了这个公式:=(LEFT(B2,1)="7")*1
,拖了下来。
现在,我的自定义排序是:
现在我可能在这里遇到了一些问题,或者我甚至可能通过Length
列进行过度杀伤。但是,逻辑几乎就是你的目标。
希望这在某种程度上有所帮助!让我们知道。 :)
答案 1 :(得分:1)
我在这里有点懒,假设你的数据位于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
答案 2 :(得分:1)
它确实有效,但有点复杂,所以只是为了好玩: 此UDF返回一个可用作排序键的值。它将代码转换为四位数的基数36,即使用A-Z和0-9作为符号(如十六进制使用0-9和A-F)。为了得到你想要的输出,我按字面顺序放置符号,首先是字母(所以“A”= 0和“0”= 26)。 (缺少的'数字'用零填充,在这种情况下是“A”s) 它有效;)
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 "[A-Z]"
rv = rv + (Asc(c) - Asc("A")) * (36 ^ (i - 1))
End If
Next
Base36Transform = rv
End Function
答案 3 :(得分:1)
假设您的数据位于列B:C中,标签位于Row1且没有插入空白行,请添加一列:
=IF(ISNUMBER(VALUE(LEFT(C2))),3,IF(FIND("-",C2)>2,2,1))
D1中的向下复制以适应和排序升序列中的升序位置。