2011-07-13 86 views
0

以下是我的代碼。我試圖通過一些行,如果有某些數據,然後刪除這些行,但是我已經編碼它的當前方式,每當我刪除一行時,我跳過它下面的一行。我改變了範圍以將高數行記​​錄到低數行,但是我的宏仍然從頂部開始向下移動。我想如果我把它移動了,刪除不會導致它跳過下一個項目。我怎樣才能讓它從列表的底部向上移動,或者有什麼更好的方法來做到這一點? 我的代碼如下:刪除行而不跳過行如何?

Dim lLastRow As Long 
Dim num As Integer 
Dim name As String 
Dim rCell As Range 
Dim afCell As Range 
Dim rRng As Range 
Dim affectedRng As Range 

Windows("Most Affected Customer Info.xls").Activate 
Worksheets("Sheet 1").Activate 
Cells(1, 1).Select 
Selection.End(xlDown).Select 
lLastRow = ActiveCell.Row 

Set affectedRng = Range("A" & lLastRow & ":A2") 
'First remove resolved entries 
For Each afCell In affectedRng 
    If (afCell.Offset(0, 4).Value = "resolved" Or afCell.Offset(0, 4).Value _ = "Resolved" Or afCell.Offset(0, 2).Value = "Resolved" Or afCell.Offset(0, 2).Value = _ "resolved") Then 
      afCell.EntireRow.Delete 
    End If 
Next afCell 

回答

3

您需要一個do循環並使用行號來處理循環中的當前位置以及終點;

例如

Dim lRow as Long 
lRow = 1 
Do Until lRow > lLastRow 
    Set afCell = Cells(lRow ,1) 

    If (afCell.Offset(0, 4).Value = "resolved" Or afCell.Offset(0, 4).Value _ = "Resolved" Or afCell.Offset(0, 2).Value = "Resolved" Or afCell.Offset(0, 2).Value = _ "resolved") Then 
     afCell.EntireRow.Delete 

     'Decrement the last row as we've removed a row 
     lLastRow = lLastRow - 1 
    else 
     'Increment the row number to move to the next one 
     lRow = lRow + 1 
    End IF 
Loop 

注:這是完全未經測試,所以你需要調試,但你應該得到的要點。

+1

如果有人發現需要更正,請告訴我,我會更新答案。 –

+0

應該做的直到(cond)..... ..... ....循環但除此之外,它的效果很好。非常感謝 – Brian

+0

就像Brian所說的那樣,我會做一個Do Until Loop,這樣它就可以工作,即使沒有數據行。 – Tipx

0

你可以嘗試改變與While循環If條件。

For Each afCell In affectedRng 
    r = afCell.Row 
    c = afCell.Column 
    While (afCell.Offset(0, 4).Value = "resolved" Or afCell.Offset(0, 4).Value _ = "Resolved" Or afCell.Offset(0, 2).Value = "Resolved" Or afCell.Offset(0, 2).Value = _ "resolved") 
     afCell.EntireRow.Delete 
     Set afCell = Cells(r, c) 
    Wend 
Next afCell 
+1

不會在While循環進入無限循環,只要你連續命中,是不是進行刪除嗎? –

+1

它不會無限循環。我已經更新了代碼。檢查更新的代碼。 – THEn

4

如何反向列表?

編輯一些代碼,試圖

For row = lLastRow To 1 Step -1 
    If Range("D" & row).Value = "resolved" Then Rows(row).EntireRow.Delete 
Next row 

我在列d「解決」這個測試在一個小的情況下,它的工作就像一個冠軍。你可能會發現代碼既能完成這一技巧,又能很好地讀取。

+0

我在問題中解決了這個問題。 – Brian

+0

要倒過去,你需要使用do while,或者使用step -1對行號進行for循環。 –

+0

爲什麼upvote ??? – Brian

0

您可以取代你的每一個做,同時,這樣的:

rowx = 2 
Do While rowx < llastrow 
    If Range("B" & rowx).Value = "resolved" Then 'replace this with the columns you're checking 
     Rows(rowx).EntireRow.Delete 
    Else 
     rowx = rowx + 1 
    End If 

Loop 
+1

您需要處理lLastRow隨着行被刪除而更改。 –

+1

只需在刪除後添加llastrow = llastrow - 1,就可以了。另外,根據創建的llastrow的方式,您可能需要一個<=來代替。 – Tipx