2017-08-31 76 views
1

我以爲我在這裏的答案幫助解決了這個問題,但我仍然只刪除每一個需要刪除的第二行。循環是:For Excel for Excel VBA只刪除每第二行

For Each row In ActiveSheet.UsedRange.Rows 
    'test for v in cell f and delete if there isn't one 
    str = Cells(row.row, "F").Value 
    Debug.Print "str is " & str 
    If InStr(1, str, "V") <> 0 Then 
     Debug.Print "hello str is " & str 
    Else 
     row.Delete Shift:=xlUp 
    End If 
Next row 

但是,當我在以下行運行它:

M 1301 
M 1302 
M 1401 
ES 1501 
M 1501 
M 1502 
MV 1502 
M 1503 
MV 1503 

我結束了:

M1301 PMH 
M1401 Rod Washer 
M1502 Rod Washer 
MV1502 Rod Washer 
MV1503 Rod Washer 

我覺得我快要瘋了。我在循環中增加了一個計數器,並認爲這是問題,但即使我已經停止使用計數器來引用行,我仍然有這個問題。

任何幫助指出我認爲是顯而易見的將不勝感激。

感謝

+0

Tyr將這次給予反饋和/或信貸給那些幫助你的人。你之前在這裏提到的帖子中沒有做過,並得到了很好的答案。你知道如何將答案標記爲「答案」嗎? –

+0

對不起 - 我現在要弄清楚該怎麼做! – Madeline

回答

2

嘗試下面的代碼,我試圖儘可能多地使用原來的邏輯(即使有更容易和更短的方式來做到這一點)。

解釋代碼註釋裏面,

注意:一般情況下,永諾環向後刪除Objects,或Rows你的情況時。

代碼

Option Explicit 

Sub DeleteV() 

Dim Rng As Range, i As Long, LastRow As Long 
Dim Str As String 

' I would rather use Worksheets("SheetName") instead 
Set Rng = ActiveSheet.UsedRange 

LastRow = Rng.Rows.Count + Rng.Row - 1 ' just in case your range starts from the 2nd row (or 3rd...) 

' allways loop backwards when deleting rows 
For i = LastRow To Rng.Row Step -1 
    'test for v in cell f and delete if there isn't one 
    Str = Cells(i, "F").Value 
    Debug.Print "str is " & Str 

    If InStr(1, Str, "V") <> 0 Then 
     Debug.Print "hello str is " & Str 
    Else 
     Rows(i).Delete 
    End If 
Next i 


End Sub 
+0

謝謝。我懷疑可能有更好的方法來做這件事,而現在這個倒退的例子對我來說更有意義。我能問你爲什麼要使用Worksheets(「SheetName」)而不是ActiveSheet? – Madeline

3

因爲刪除例如列4行row.Delete Shift:=xlUp,第5行現在變成了4排,當你刪除的行,然後你去到下一行(第5行這是舊行6)。

您可以在刪除後放置Row = Row - 1或者您可以以不同的方式向後走。

For X = range("A" & rows.count).end(xlup).row to 2 step - 1 
    'Do something per row 
    'Delete a row if need be 
Next 

這應該給你足夠的想法來解決這個問題。

+0

尼斯詳細解釋 –

+0

謝謝。結束後括號中的xlup的目的是什麼? – Madeline

+0

@Madeline它代表向上箭頭。 – AntiDrondert

1

我可以建議在代碼中的一些變化,這將有助於:

'always store reference to the sheet in a variable! 
Dim sh As Worksheet 
Set sh = ActiveSheet 
'determine last row in F column 
lastRow = sh.Cells(sh.Rows.Count, 6).End(xlUp).Row 

For i = lastRow To 1 Step -1 
    'test for v in cell f and delete if there isn't one 
    'we make it uppercase, to avoid situation that we didn't match v with V 
    str = UCase(sh.Cells(i, 6).Value) 
    Debug.Print "str is " & str 
    If InStr(1, str, "V") > 0 Then 
     Debug.Print "hello str is " & str 
    Else 
     Rows(i).Delete 
    End If 
Next i 
+0

你想在循環刪除行時循環? –

+0

感謝您的評論:) –

+0

謝謝 - 爲什麼總是將變量表中的引用存儲在變量中? – Madeline

1

你擦除某行的那一刻,所有的下一行的索引減少由一個。

這意味着,如果您刪除行n因爲它包含一個「V」,則行n+1現在變爲n並且不會被測試。

因此,您的代碼每隔一行跳過一次。

要修復它,請嘗試向後遍歷行。