VBAmacros使用marlett检查删除未经检查的行

我在VBA中并没有太多的背景知识,但是我正在尝试创build一个macros,在按下button的时候,删除某个范围内没有选中标记的所有行。 我浏览了一些论坛,并了解到一个“马利特”检查,其中该字体中的字符“a”显示为复选标记。 这里是我必须自动生成“marlett检查”的代码,当点击在适当的范围A列中的单元格:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count > 1 Then Exit Sub If Not Intersect(Target, Range("A10:A111")) Is Nothing Then Target.Font.Name = "Marlett" If Target = vbNullString Then Target = "a" Else Target = vbNullString End If End If End Sub 

然后我有另一个macros(分配给一个button),实际上删除button时按下“A”列中没有复选标记的行:

 Sub delete_rows() Dim c As Range On Error Resume Next For Each c in Range("A10:A111") If c.Value <> "a" Then c.EntireRow.Delete End If Next c End Sub 

一切正常,但唯一的问题是,我必须多次按下button之前,所有未经检查的行被删除! 这似乎是我的循环不能正常工作 – 任何人都可以请帮助?

谢谢!

我想这可能是由于你如何删除行,你可能会在每次删除后跳过一行。

您可能需要更改for-for循环的for循环。 所以你可以控制你正在使用的索引。 看到这个答案或其他问题的答案,看看如何做到这一点。

下面是一个修改后的版本,应该适合您的(可能的)问题。

 Sub Main() Dim Row As Long Dim Sheet As Worksheet Row = 10 Set Sheet = Worksheets("Sheet1") Application.ScreenUpdating = False Do If Sheet.Cells(Row, 1).Value = "a" Then 'Sheet.Rows(Row).Delete xlShiftUp Row = Row + 1 Else 'Row = Row + 1 Sheet.Rows(Row).Delete xlShiftUp End If Loop While Row <= 111 Application.ScreenUpdating = True End Sub 

更新 尝试我对if块做的编辑,猜测。 当我有优秀的时候会看。

无论build议的更改如何,它都会进入无限循环。 问题是当它接近数据的末尾时,它不断发现空行(因为没有更多的数据!),所以它一直在删除它们。

下面的代码应该可以工作。

 Sub Main() Dim Row As Long: Row = 10 Dim Count As Long: Count = 0 Dim Sheet As Worksheet Set Sheet = Worksheets("Sheet1") Application.ScreenUpdating = False Do If Sheet.Cells(Row, 1).Value = "a" Then Row = Row + 1 Else Count = Count + 1 Sheet.Rows(Row).Delete xlShiftUp End If Loop While Row <= 111 And Row + Count <= 111 Application.ScreenUpdating = True End Sub