Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果单词拼写错误,Excel VBA将删除行_Excel_Vba - Fatal编程技术网

如果单词拼写错误,Excel VBA将删除行

如果单词拼写错误,Excel VBA将删除行,excel,vba,Excel,Vba,如果单元格中包含拼写错误的单词,我将尝试删除整行。如果删除了一行,is将跳过一行,从而丢失可能直接出现在另一行之后的拼写错误的单词 代码如下: Sub DeleteMispelledCells() For Each cl In ActiveSheet.UsedRange If Not Application.CheckSpelling(Word:=cl.Text) Then _ cl.EntireRow.Delete Next cl End Sub 我知道问题是cl没有考虑到当前行已被删除,但

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

代码如下:

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

我知道问题是cl没有考虑到当前行已被删除,但我不知道如何更正此问题。我还知道,如果循环从最后一行运行到第一行,而不是从第一行运行到最后一行,那么它也会得到纠正。但是,我也不知道如何执行此操作。

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

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
我不能百分之百确定所有语法都正确,因为我不是在一台可以测试它的计算机上,但它至少应该给你一个开始的地方。

这是这种循环控制逻辑(在任何编程语言中)中的一个经典问题。如果您正在迭代,比如说,5行(“#1..5”),然后删除第一行,那么。。。现在有4行,过去的第2行现在是第1行,过去的第3行现在是第2行。因此,循环继续到“第2行”,猜猜看:您刚刚跳过了“前一行第2”,现在位于位置1

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


另一种方法,也是我个人更喜欢的方法,是首先循环浏览项目,标记您决定要删除的项目(例如,在另一列中设置标志值)。然后,在一个单独的(向后)循环中,实际删除标记的项。这将使您更容易正确地调试逻辑,以检查那些错误的乌德首先决定要执行的操作,然后返回并执行。

对于每个cl In.行(lRow)
应该是
对于每个cl In.行(lRow)
,并且它在我的机器上运行良好。不同之处在于
.Row
.Rows
@JoshuaRoss感谢您的测试,现已修复。没问题,我考虑过只为您编辑,但您必须更改超过1个字符^ ^ ^@eirikdaude我以为这样做了,但我收到以下错误“无效使用Null”对于下一行代码
如果不是Application.CheckSpelling(Word:=cl.Text),那么
我假设这是因为它正在检查一个不包含值的单元格中的拼写,我不是绝对确定如何定义
UsedRange
,而是为每个cl in.行(lRow)切换
对于Intersect(.Rows(lRow),.UsedRange)中的每个cl
可能有效,或者您可以在注释中引用的语句之外添加另一个
If
-语句,检查单元格是否为空。更新了答案,并举例说明了如何执行后者@弗雷德朗格马尔基三