2017-02-14 56 views
-5

我想刪除行如果H欄包含以下任一值:刪除行如果H欄包含以下任一值 - VBA

1) % 
2) Resistor 
3) Capacitor 
4) MCKT 
5) Connector 
6) anything else I may want to add to this list... 

發現這對谷歌和編輯 - 它工作得很好 - 不知道是否有更高效的方式來做到這一點。

Sub DeleteRows() 
lastrow = Cells.SpecialCells(xlCellTypeLastCell).Row 
readrow = 1 
For n = 1 to lastrow 
    If Range("H" & ReadRow).Value = "%" Or _ 
    Range("H" & ReadRow).Value = "Resistor" Or _ 
    Range("H" & ReadRow).Value = "Capacitor" Or _ 
    Range("H" & ReadRow).Value = "MCKT" Or _ 
    Range("H" & ReadRow).Value = "Connector" Then 
    Range("H" & ReadRow).EntireRow.Delete 
    Else 
     readrow = readrow + 1 
    End If 
    Next 
End Sub 
+2

堆棧溢出不是免費的代碼寫入服務。你有什麼嘗試? –

+0

我會學習如何使用循環,如果我是你 –

回答

5

有更有效的方法,但是這一個:

  1. 循環倒退。
  2. 更改ReadRow到n,在具有兩個變量沒有任何意義:

代碼:

Sub DeleteRows() 
Dim Lastrow as long, n as long 
lastrow = Cells.SpecialCells(xlCellTypeLastCell).Row 

For n = lastrow to 1 Step -1 
    If Range("H" & n).Value = "%" Or _ 
    Range("H" & n).Value = "Resistor" Or _ 
    Range("H" & n).Value = "Capacitor" Or _ 
    Range("H" & n).Value = "MCKT" Or _ 
    Range("H" & n).Value = "Connector" Then 
     Rows(n).Delete 
    End If 
Next 
End Sub 

另一種方法是使用Select Case

Sub DeleteRows() 
Dim Lastrow as long, n as long 
lastrow = Cells.SpecialCells(xlCellTypeLastCell).Row 

For n = lastrow to 1 Step -1 

    Select Case Range("H" & n).Value 
     Case "%","Resistor","Capacitor","MCKT","Connector" 
     Rows(n).Delete 
    End Select 
Next 
End Sub 

這使得它更容易添加到名單。

+0

步驟-1的目的是什麼?你不想讓它從第一行開始到最後一行...不是最後一行-1? @Scott Craner – CC268

+0

不理會我以前的評論 - 我看到你在做什麼 - 從最後一排到第一排的目的是什麼? @Scott Craner – CC268

+0

@ CC268當你刪除一行時說第10行,那麼第11行變成第10行,當它迭代時,n從10跳到11,第11行是什麼,現在10跳過了。通過倒退它不會有跳過行的問題。 –

0

這很好。

Option Explicit 
Option Compare Text 

Sub Delete_Rows() 

Dim LastRow As Long, ReadRow As Long, n As Long 

With ThisWorkbook.Sheets("Sheet1") 
    LastRow = .Cells(.Rows.Count, "H").End(xlUp).row 
End With 

ReadRow = 1 
For n = 1 To LastRow 
    If Range("H" & ReadRow).Value Like "*%*" = True Or _ 
    Range("H" & ReadRow).Value Like "*Resistor*" = True Or _ 
    Range("H" & ReadRow).Value Like "*Transistor*" = True Or _ 
    Range("H" & ReadRow).Value Like "*Micro*" = True Then 
     Range("H" & ReadRow).EntireRow.Delete 
    Else 
     ReadRow = ReadRow + 1 
    End If 
    Next 
End Sub