Excel VBA删除行如果拼写错误的Word

时间:2015-04-20 19:28:04

标签: excel excel-vba vba

如果单元格包含拼写错误的单词,我试图删除整行。如果删除了一行,则跳过一行,从而丢失可能在另一行之后直接出现的拼写错误的单词。

以下是代码:

Sub DeleteMispelledCells()
For Each cl In ActiveSheet.UsedRange
If Not Application.CheckSpelling(Word:=cl.Text) Then _
cl.EntireRow.Delete
Next cl
End Sub

我理解问题是cl没有考虑当前行被删除,但我不知道如何纠正这一点。我也知道如果循环从最后一行跑到第一行而不是从第一行到最后一行,它也会被纠正。但是,我不知道该怎么做。

2 个答案:

答案 0 :(得分:5)

为了以相反的顺序遍历每一行,您将执行以下操作:

Sub DeleteMispelledCells()
  Dim lRow As Long, cl As Range

  With ActiveSheet
    For lRow = .UsedRange.Rows.Count To 1 Step -1
      For Each cl In .Rows(lRow)
        If Not IsEmpty(cl) Then
          If Not Application.CheckSpelling(Word:=cl.Text) Then
            cl.EntireRow.Delete
            Exit For
          End If
        End If
      Next cl
    Next lRow
  End With
End Sub

我并非100%确定我已经掌握了所有语法,因为我不在可以测试它的计算机上,但至少应该给你一些起点。

答案 1 :(得分:2)

这是一种经典问题,在这种循环控制逻辑中(在任何编程语言中)。如果你正在迭代,比如5行("#1..5"),你删除了第一行,那么......现在有4行,而以前是第2行的是现在排#1和以前的排#3现在是#2。因此,循环进入"行#2"并猜测:你刚刚跳过" 行#2,"现在位置#1。

如前所示,向后循环列表是一种很好的补偿方式。

另一种方式,也就是我个人更喜欢的方式,是首先遍历项目,标记您决定要删除的项目(例如,通过设置另一列中的标志值)。 然后,在一个单独的(向后)循环中,实际上删除了已标记的项目。这将使您更容易正确调试检查那些狡猾的wurds的逻辑。 ;-)首先决定你想做什么,然后回去做。