2013-12-10 51 views
3

我有一張大量自動過濾的行(> 200,000)。我試圖通過一個列向上循環,直到找到與當前單元格不同的第一個單元格爲止。我可以循環「向下」穿過可見單元使用:快速反向循環過濾列表的方式?

For i = rng.Count To 1 Step -1 
    If rng.Cells(i).EntireRow.Hidden Then 
    'do nothing 
    ElseIf 'check different value 
    End If 
Next i 

但隨着大量這樣可以隱藏的列:

For Each cl In rng.SpecialCells(xlCellTypeVisible) 
    'check for different value 
Next cl 

我還可以循環「向上」使用跳過隱藏的行即使只有幾百個可見行,也需要花點時間跳過所有這些行。我嘗試過使用rng.SpecialCells(xlCellTypeVisible),並通過它們後退,但它似乎也通過隱藏的單元格。

  1. 有沒有辦法顛倒For Each循環的順序?
  2. 有沒有更快的方法來做到這一點?

感謝

+3

你可以使用第一種方法填充行號到一個數組,然後使用第二種方法反向循環數組。 –

+0

您可以複製整個表格並刪除重複項目。然後你的工作表function.find(...)。 「因爲」比使用Excel功能還要糟糕。 – Makah

+0

'我正在通過一個列向上循環,直到找到與當前單元格不同的第一個單元格。「我有一個問題要問你。你爲什麼想要反向循環?你想對數據做些什麼?如果是,那麼蒂姆和加里的解決方案將幫助你。但是如果你想使用行(範圍),那麼你將不得不採取不同的技術。 –

回答

3
Sub Tester() 
    Dim x As Long, n As Long 
    Dim a() As Long 
    Dim rng As Range, c As Range, vis As Range 
    Dim sht As Worksheet 

    Set sht = ActiveSheet 
    Set rng = sht.Range("A1:A1000") 

    Set vis = rng.SpecialCells(xlCellTypeVisible) 
    n = vis.Cells.Count 
    ReDim a(1 To n) 
    x = 1 

    For Each c In vis.Cells 
     a(x) = c.Row 
     x = x + 1 
    Next c 

    For x = n To 1 Step -1 
     Debug.Print a(x), sht.Cells(a(x), 1) 
    Next x 
End Sub 
2

你可以建立可視細胞的採集,然後反向提取它們:

Sub Backwards() 
    Dim N As Long, col As Collection, RR As Range, r As Range 
    Dim i As Long 
    Set RR = Intersect(ActiveSheet.UsedRange, Range("A:A").Cells.SpecialCells(xlCellTypeVisible)) 
    Set col = New Collection 
    For Each r In RR 
     col.Add (r.Address) 
    Next r 
    N = col.Count 

    For i = N To 1 Step -1 
     Set r = Range(col(i)) 
     MsgBox r.Address 
    Next i 
End Sub