簡體   English   中英

根據列中的條件刪除行

[英]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使它不刪除標題。

出於性能原因,我將以另一種方式執行此操作(逐行讀取+刪除速度很慢)。 我之前也回答過類似的問題,我認為它也很適合您的帖子。

我建議您可以做的是:

  • 而不是逐行讀取工作表,而是將整個范圍一次加載到數組中;
  • 不必逐行刪除,而是將所需的值傳輸到內存中的第二個數組中。
  • 當您擁有所需的數據時,請應用oRange.clearcontents清除當前范圍;
  • 通過應用oRange = vArray將新的數據數組顯示到工作表中。

讀/轉換數據在內存中執行,讀和寫僅執行一次。

在此線程中,您有我之前編寫的代碼: 在多次迭代后,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM