2017-07-26 80 views
0

我有一个包含5位数字的大型列表的电子表格。我想用最后两位数字来组织这些数字。我有一个工作公式,这样做,所以这不是我的问题。我现在的问题是,这些数字是由最后2位数字组织的,现在有什么办法可以按照所有5位数字对这些数字进行排序吗?我的意思是这样的:我现在的数字是有序的这样的:使用VBA宏对最后两位数字进行排序

12300 
    15600 
    12400 
    15700 
    12301 
    15601 
    12401 
    15601 
    etc 

我现在做什么是排序他们再次得到所有5个数字,但也具有通过最后2个位数它们排序的子集内像这样:

12300 
    12400 
    15600 
    15700 
    12301 
    12401 
    15601 
    15701 
    etc 

这可能吗?

这里是将由最后两位数字进行排序的代码:

[B:B].Insert Shift:=xlToRight 
n = [A65000].End(xlUp).Row 
For Each c In Range("A1:A" & n) 
c.Offset(0, 1) = Right(c, 2) 
Next c 
Range("A1:B" & n).Sort Key1:=[B2], Order1:=xlAscending 
[B:B].Delete 
+1

创建一个3位数列和一个2位数列。先进的排序界面允许您先排序一列,然后排序。 –

+0

谢谢,我会这样做的。 –

+0

对不起,约翰科尔曼,我不小心删除了你的评论。我编辑了我的问题以包含代码。 –

回答

0

您上次评论的解决方案似乎很简单;这样做同样的事情(Sheet1中,柱A)

Public Sub CustomSort() 
    Const START_ROW = 2, START_COL = 1 
    Dim ws As Worksheet, lr As Long, lFormula As String, rFormula As String 
    Dim sortL As Range, sortR As Range 

    Application.ScreenUpdating = False 
    Set ws = ThisWorkbook.Worksheets("Sheet1") 
    lr = ws.Cells(Rows.Count, "A").End(xlUp).Row 

    ws.Columns(START_COL + 1).Insert Shift:=xlToRight 
    ws.Columns(START_COL + 2).Insert Shift:=xlToRight 
    lFormula = "=LEFT(" & Replace(ws.Cells(START_ROW, START_COL).Address, "$", "") & ",3)" 
    rFormula = "=RIGHT(" & Replace(ws.Cells(START_ROW, START_COL).Address, "$", "") & ",2)" 

    With ws.UsedRange 'Apply Formulas 
     .Columns(START_COL + 1).Offset(1).Formula = lFormula 
     .Columns(START_COL + 2).Offset(1).Formula = rFormula 
     Set sortL = .Columns(START_COL + 1).Offset(1).Resize(lr - 1) 
     Set sortR = .Columns(START_COL + 2).Offset(2).Resize(lr - 1) 
    End With 

    With ws.Sort  'Apply Sort 
     With .SortFields 
      .Clear 
      .Add Key:=sortR 
      .Add Key:=sortL 
     End With 
     .SetRange ws.UsedRange.Offset(1).Resize(lr - 1) 
     .Apply 
    End With 

    ws.Columns(START_COL + 2).Delete 'Remove helper columns (if needed) 
    ws.Columns(START_COL + 1).Delete 'Remove helper columns (if needed) 
    Application.ScreenUpdating = True 
End Sub 

结果:

Before | After 
-------------- 
12300 | 12300 
15600 | 12400 
12400 | 15600 
15700 | 15700 
12301 | 12301 
15601 | 12401 
12401 | 15601 
15601 | 15601 
0

试试这个代码。

Sub test() 
    Dim vDB, vNew() 
    Dim Ws As Worksheet 
    Dim n As Long, i As Long 
    Set Ws = ActiveSheet 

    With Ws 
     vDB = .Range("a1", .Range("a" & Rows.Count).End(xlUp)) 
     n = UBound(vDB, 1) 
     ReDim vNew(1 To n, 1 To 2) 
     For i = 1 To n 
      vNew(i, 1) = Left(vDB(i, 1), 3) 
      vNew(i, 2) = Right(vDB(i, 1), 2) 
     Next i 
     .Range("b:c").Insert 
     .Range("b1").Resize(n, 2) = vNew 
     .Range("a1").CurrentRegion.Sort Key1:=Range("c1"), Order1:=xlAscending, Key2:=Range("b1"), Order2:=xlAscending, Header:=xlNo 
     .Range("b:c").Delete 
    End With 
End Sub