在列中匹配标准后,删除Excel表中的行

我的数据看起来像这样。

在这里输入图像说明

我想删除名为Position from column的列中的值为1的行。我写了一个macros来做这个

Sub DEL_row() row_number = 2 Do DoEvents row_number = row_number + 1 Position_from_first = Sheet8.Range("E" & row_number) If InStr(Position_from_first, "1") >= 1 Then Sheet8.Rows(row_number & ":" & row_number).Delete End If Loop Until Position_from_first = "" MsgBox "completed" End Sub 

但是当我运行它,我得到一个错误。 信息框说已完成,但它不会执行所需的工作,当我通过Excel表单。 任何人都可以帮我解决问题。

非常感谢帮助…

虽然你的概念是现货,你的语法和你对VBA的理解有一些错误。 我已经列在下面。

  1. 这个代码根本不需要做任何事情。
  2. 删除行时,您需要从最后一行开始,然后返回到循环的起始位置,因为当您删除一行时,它会影响下面的所有行引用,所以如果您继续前进,循环计数将会丢失行。
  3. 您还需要使用.EntireRow.Delete.Delete只会删除单元格内容。

我已经修复了下面的代码来反映这些问题。 我还提供了一个更简单的替代scheme来解决您的问题,使用AutoFilter方法。

 Sub DEL_row() 'get last used row in column E row_number = Sheet8.Range("E" & Sheet8.Rows.Count).End(xlup).Row For x = row_number to 2 Step -1 Position_from_first = Sheet8.Range("E" & row_number) If InStr(Position_from_first, "1") >= 1 Then 'If Sheet8.Range("E" & row_number) = 1 ' this will also work Sheet8.Rows(row_number & ":" & row_number).EntireRow.Delete End If Next MsgBox "completed" End Sub 

如果使用AutoFilter,则可以完全避免循环(并节省时间),如下所示:

 Sub DEL_row() With Sheet8 'get last used row in column E row_number = .Range("E" & .Rows.Count).End(xlup).Row With .Range("E1:E" & row_number) .AutoFilter 1, "1" .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete End With .AutoFilterMode = False End With Msgbox "completed" End Sub 

我收集你不想删除11,12,31 ,…等等,所以使用InStr函数不是一个适当的方法来识别正确的行删除。 您的示例数据图像显示列E具有真正的右alignment数字,并且Range.Value2属性可以直接与1进行比较以确定是否应该删除该行。

如前所述,删除行时,从下到上工作非常重要。 如果你从顶部到底部工作,当一行被删除时,你可能会跳过一行,所有东西都会移动,然后增加到下一行。

 Option Explicit Sub DEL_1_rows() 'declare your variables Dim rw As Long 'this will greatly improve the speed involving row deletion Application.ScreenUpdating = False With sheet8 '<~~ this is a worksheet CodeName - see below For rw = .Cells(Rows.Count, 5).End(xlUp).Row To 2 Step -1 If .Cells(rw, 5).Value2 = 1 Then .Rows(rw).EntireRow.Delete Next rw End With Application.ScreenUpdating = True MsgBox "completed" End Sub 

AutoFilter方法可以加速识别要删除的行。 但是,一次大的批量删除仍然需要大量的处理时间。

 Option Explicit Sub DEL_Filtered_rows() 'this will greatly improve the speed involving row deletion Application.ScreenUpdating = False With Sheet8 '<~~ this is a worksheet CodeName - see below If .AutoFilterMode Then .AutoFilterMode = False With .Range(.Cells(1, 5), .Cells(Rows.Count, 5).End(xlUp)) .AutoFilter field:=1, Criteria1:=1 With .Resize(.Rows.Count, .Columns.Count).Offset(1, 0) If CBool(Application.Subtotal(103, .Cells)) Then .SpecialCells(xlCellTypeVisible).EntireRow.Delete End If End With .AutoFilter End With End With Application.ScreenUpdating = True MsgBox "completed" End Sub 

我发现有点奇怪的是,您使用Worksheet .CodeName属性而不是Worksheet .Name属性来标识工作表。 我已经包含了一些链接,以确保您正确使用命名约定。 无论如何,我已经使用With … End With语句来避免重复识别父工作表。