2015-07-10 242 views
0

Im在excel vba中編寫一個簡單的宏,如果第一個單元格有特定的文本,它將刪除整行。 這裏是到目前爲止的代碼:Excel VBA For Each skipping cells

Sub MyMacro() 
    For Each MyCell In Worksheets("Hoja2").Range("A1:A20") 
     If MyCell.Value = "BORRAR" Then 
      MyCell.EntireRow.Delete 
     End If 
    Next 
End Sub 

我Sheet2中(Hoja2)僅僅有兩列,第一列是完全「BORRAR」從A1到A20和第二列具有唯一號碼,從1到20。

如果我激活宏,它會刪除除2,4,6,8,10,12,14,16,18和20以外的每一行。 如果我再次激活宏,它會刪除除了4,8之外的所有內容,12,16,20 如果我再次激活宏,它將刪除除8,16 等以外的所有內容。

這是怎麼發生的?據我瞭解,我的宏一個接一個地檢查第一列的單元格是否包含單詞「BORRAR」,如果是,則刪除整行。爲什麼要刪除2,4,8 ......的倍數?

+0

答案有問題本身 – Raghavendra

+0

當你刪除行時,你需要通過行後退。嘗試一個循環,如'For I = lastrow to 2 Step -1' – Gareth

+0

這意味着下一行佔用了刪除的行。但索引被移動一個內核中的下一行單元內部爲 – Raghavendra

回答

4

這是因爲你正在向前邁進行並刪除它們。

如果您刪除第2行,那麼第3行將成爲新的第2行,並且循環繼續查看第3行,這實際上是第4行 - 第3行已完全丟失。

用途:

For x = 20 to 1 Step -1 
    If Worksheets("Hoja2").Cells(x,1) = "BORRAR" then 
     Worksheets("Hoja2").Cells(x,1).EntireRow.Delete 
    End IF 
Next x 

注意 - 我還沒有測試上面的代碼,但它應該工作。

+0

就像一個魅力。 TY –

0

這意味着下一行佔用了刪除的行。但是索引被移動了一個在內核中獲取下一行單元的內存

0

問題的原因是每個循環檢測到它有多少元素需要循環。然後它開始第一,第二,第三等元素的操作。當你刪除第一個元素時,第二個元素成爲第一個元素,但循環繼續它與新的第二個元素一起工作。如果使用Range("A20:A1")時效果更好,您可以嘗試。如果仍然無法使用,則必須使用For ToWhile循環。