[英]Delete rows based on condition in a column
我已經在網上和此處進行過搜索,但找不到任何符合要求和工作的內容。 我有一些有效的代碼,但由於范圍長度在刪除行時會發生變化,因此無法捕獲要刪除的所有行,因此我最終運行了幾次,效果不佳...所以我我現在嘗試按照此線程上的建議嘗試使用自動篩選方法。
我有一個包含幾列的電子表格,其中之一是“成本”。 我需要遍歷“成本”列(有時可能是第9列,有時是10列,因此下面是“查找”位),並刪除成本為0的任何行...
以下是我到目前為止編寫的代碼,任何幫助將非常非常感謝!!!!
-編輯3:進行了更多代碼更改...下面是新代碼。
Sub RemoveRows()
Dim cell As Range
Dim lastRow As Long
Dim lastColumn As Integer
Dim criteraColumn As Integer
Dim criteriaRange As Range
lastRow = Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
lastColumn = Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
Rows(1).EntireRow.Select
criteriaColumn = Selection.Find(What:="Cost", After:=ActiveCell, LookIn:= _
xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False).Column
Set criteriaRange = Range("A1", Cells(lastRow, lastColumn))
criteriaRange.AutoFilter Field:=criteriaColumn, Criteria1:="£0.00"
AutoFilter.Range.Delete
ActiveSheet.AutoFilterMode = False
End Sub
當我運行此命令時,它將過濾器應用於正確的范圍和正確的列。 然后,我得到錯誤消息:“運行時錯誤'424':必需的對象”,該錯誤消息適用於AutoFilter.Range.Delete
行。 當我在此按'end'或'debug'並查看電子表格時,過濾器已應用於正確的列,並且檢查了正確的選項(0.00英鎊),但沒有返回任何結果(我知道我需要做將來在這種情況下會進行一些錯誤處理,但目前此過濾器至少應返回10行)。 如果我在電子表格的過濾器設置上手動按“確定”(而不更改其中的任何一個!),我的10個結果將正確顯示,因此我不確定為什么以編程方式執行時它們沒有顯示?
如果需要,很高興提供電子表格示例,這真的讓我感到困惑!
電子表格可以在這里找到
您應該能夠使用Excel自動篩選刪除行。
Cells.AutoFilter Field:=criteriaColumn, Criteria1:="£0.00"
ActiveSheet.AutoFilter.Range.Offset(1).Delete
ActiveSheet.ShowAllData
這將過濾成本= 0,然后刪除所有與過濾器匹配的行。
該運算符自動等於,因此您不需要“ =£0.00”作為參數。
我在ActiveSheet中添加了AutoFilter,以擺脫找不到的對象,而Offset使它不刪除標題。
出於性能原因,我將以另一種方式執行此操作(逐行讀取+刪除速度很慢)。 我之前也回答過類似的問題,我認為它也很適合您的帖子。
我建議您可以做的是:
讀/轉換數據在內存中執行,讀和寫僅執行一次。
在此線程中,您有我之前編寫的代碼: 在多次迭代后,VBA代碼的執行速度變慢
讓我知道這是否可以幫助您,或者您是否希望獲得更多具體的信息/代碼。
您需要做的是向后退一步,因為默認情況下,刪除行會自動在Excel中將行上移一位。
更換:
For Each cell In criteriaRange.Cells
If cell.Value = 0 Then
cell.EntireRow.Delete
End If
Next cell
帶有:
Dim i As Integer
For i = criteriaRange.Rows.Count To 1 Step -1
If criteriaRange.Cells(i) = 0 Then
criteriaRange.Cells(i).EntireRow.Delete
End If
Next
另外, ScreenUpdating
對宏的方法沒有影響。 對於宏執行的每個操作,它基本上都關閉了“屏幕閃爍”,從而使其運行得更快,更流暢,以提供用戶體驗。
您可以使用它,以便每當它刪除一行時,它要么回到列的頂部,要么可以從計數中減去一個。 無論哪種方式,它都不會跳過任何行。 我會提供實際的代碼,但是我是VBA的新手,並且不知道該怎么做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.