Excel 如果我的条件得到满足,我如何循环回我当前的单元格?

Excel 如果我的条件得到满足,我如何循环回我当前的单元格?,excel,vba,for-loop,Excel,Vba,For Loop,这是我在SO上的第一篇帖子,所以我希望我做的是正确的 我正在尝试从数据中删除符合以下条件的行: 第一列的值与它下面的单元格不同 第三列的值等于它下面的单元格 我的代码示例如下所示: For Each Cell In MyRangeA3 If Cell.Value <> Cell.Offset(1).Value Then If Cell.Offset(, 2).Value = Cell.Offset(1, 2).Value Then

这是我在SO上的第一篇帖子,所以我希望我做的是正确的

我正在尝试从数据中删除符合以下条件的行:

  • 第一列的值与它下面的单元格不同
  • 第三列的值等于它下面的单元格
  • 我的代码示例如下所示:

    For Each Cell In MyRangeA3
            If Cell.Value <> Cell.Offset(1).Value Then
                If Cell.Offset(, 2).Value = Cell.Offset(1, 2).Value Then
                Cell.Offset(1).EntireRow.Delete
                End If
            End If
    Next Cell
    
    MyRangeA3中每个单元格的
    
    如果单元格.Value单元格.Offset(1).Value,则
    如果Cell.Offset(,2).Value=Cell.Offset(1,2).Value,则
    单元格偏移量(1).EntireRow.Delete
    如果结束
    如果结束
    下一个细胞
    

    我面临的问题是,我的宏将转到下一个单元格,因此我必须重新运行宏才能删除符合条件的下一行。要在一次运行中完成此操作,我应该向代码中添加哪些内容?

    您可以收集匹配的单元格,然后删除相应的行:

    ' ... your code    
    
    Dim toDel As Range
    For Each cell In MyRangeA3
        If cell.Value <> cell.Offset(1).Value Then
            If cell.Offset(, 2).Value = cell.Offset(1, 2).Value Then
                If toDel Is Nothing Then    'collect cells to further delete
                    Set toDel = cell.Offset(1)
                Else
                    Set toDel = Union(toDel, cell.Offset(1))
                End If
            End If
        End If
    Next cell
    ' delete all rows for appropriate collected cells
    ' debug the script before actually deleting lines with, e.g. 
    ' toDel.EntireRow.Interior.ColorIndex = 3 instead toDel.EntireRow.Delete
    If Not toDel Is Nothing Then toDel.EntireRow.Delete
    
    ' your code ...
    
    ”。。。你的代码
    暗托德尔范围
    对于MyRangeA3中的每个单元格
    如果单元格.Value单元格.Offset(1).Value,则
    如果cell.Offset(,2).Value=cell.Offset(1,2).Value,则
    如果toDel为空,则“收集单元格以进一步删除”
    设置toDel=单元格偏移量(1)
    其他的
    设置toDel=Union(toDel,单元格偏移量(1))
    如果结束
    如果结束
    如果结束
    下一个细胞
    '删除适当收集的单元格的所有行
    '在实际删除行之前调试脚本,例如。
    'toDel.EntireRow.Interior.ColorIndex=3而不是toDel.EntireRow.Delete
    如果Not toDel为Nothing,则toDel.EntireRow.Delete
    '您的代码。。。
    
    1。2.对i=Lastrow使用反向循环
    到步骤-1
    ,然后匹配并删除行。正如@SiddharthRout所述:从列表中删除项目是一个众所周知的陷阱:当您从列表的开头开始并继续时,您可能无法删除所有需要的项目。因此,您需要从列表的末尾开始,以相反的方向遍历列表。:-)@悉达多,我能知道你说的第一步是什么意思吗?抱歉,我对VBA比较陌生。我尝试了您的代码,但最后遇到了“运行时错误'424':需要对象”line@OliverTheseira出现此错误的原因是,如果跳过第一行
    Dim toDel As Range
    ,则没有复制第一行
    Dim toDel As Range
    ,然后,toDel隐式声明为Variant,初始值为空,如果未找到适合删除的行,则toDel的值保持为空,这将导致错误。如果将
    Dim toDel声明为Range
    ,则toDel的初始值将为Nothing,如果未找到适合删除的行,则将不满足“If Not toDel Is Nothing”条件,并且不会尝试从空范围中删除行。多么奇怪,我确实将它包含在我的变量声明列表中,而不是代码的其余部分,但它不起作用。在我按照你的回答把它移下来之后,它工作得很好。你能解释一下为什么会这样吗?另外,为什么在我上面的变量声明列表中声明“Cell as Range”效果很好。@Olivertheira我看不到您的所有代码,因为它没有显示出来。