2015-10-04 146 views
1

我有一个带有顺序和时间戳的工作表。在列中遍历范围

我想根据右侧列中的时间戳对这些行进行排序,但我想保留它们的分组位置。就像我想要排序4个第一行,但留在第4行,然后我想排序第8和第9行,但让他们留在那里。

我已经设法选择了两个范围,并且省略了“中间”,但除非关键单元处于一个范围内,否则.sort方法将不起作用。所以我想也许如果我循环通过列中的不同范围或类似的东西。

这是我现在的代码,我认为它不会有所作为。

Dim LR As Long, cell As Range, rng As Range 
    With Sheets("Ark1") 
    Dim start As Range 
    Set start = Range("N16") 

    LR = .Range("N" & Rows.Count).End(xlUp).Row 
    For Each cell In .Range("N16:N" & LR) 
     If cell.value <> "" Then 
      If rng Is Nothing Then 
       Set rng = cell 
      Else 
       Set rng = Union(rng, cell) 
      End If 
     End If 
    Next cell 
     rng.Sort key1:=start, order1:=xlAscending, Header:=xlGuess 
    End With 
+1

是否有一个模式这些团体还是你如何区分它们? (它们是否被col N中的空白单元分隔开) –

回答

1

那么,实现您的目标的最简单方法是按照自定义顺序重新计算行数。例如,将#1分配给第一组,#2分配给第二组等等。然后,您只需按两列对所有范围进行排序,首先是您的自定义“订单”和第二个时间戳。 :)

0

假设每个块由N列空值分开,并且要为每块全行进行排序,这里是代码,我建议:

Public Sub testSort() 
    Dim firstRow As Long 
    Dim lastRow As Long 
    Dim blockStart As Long 
    Dim blockEnd As Long 
    Dim rng As Range 

    firstRow = 3 
    lastRow = Cells(Rows.Count, 14).End(xlUp).Row 
    blockStart = firstRow 

    Do 
     If Cells(blockStart + 1, 14) <> "" Then 
      blockEnd = Cells(blockStart, 14).End(xlDown).Row 
     Else 
      blockEnd = blockStart 
     End If 
     Set rng = Range(Rows(blockStart), Rows(blockEnd)) 
     rng.Sort Key1:=rng.Cells(, 14), Order1:=xlAscending, Header:=xlNo 
     blockStart = Cells(blockEnd, 14).End(xlDown).Row 
    Loop Until blockEnd >= lastRow 

End Sub