0

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

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

然后我有另一个宏(分配给一个按钮),当按下按钮时,它实际上删除了“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

一切正常,但唯一的问题是我必须多次按下按钮才能删除所有未选中的行!看来我的循环无法正常工作-有人可以帮忙吗?

谢谢!

4

1 回答 1

2

我认为这可能是由于您删除行的方式,每次删除后您可能会跳过一行。

您可能希望将 for-each 更改为常规 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 块所做的编辑,有点猜测。当我有excel时会看它。

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

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

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
于 2013-04-05T17:19:14.687 回答