【问题标题】:How do I loop back to my current cell if my conditions are met?如果满足我的条件,如何循环回当前单元格?
【发布时间】:2021-08-19 06:59:06
【问题描述】:

这是我关于 SO 的第一篇文章,所以我希望我这样做是正确的。

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

  1. 第一列的值与其下面的单元格不同
  2. 第三列的值等于它下面的单元格

我的代码示例如下所示:

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

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

【问题讨论】:

  • 1. Find the last row 2. 使用反向循环 For i = Lastrow to 1 Step -1 然后匹配并删除行。
  • 正如@SiddharthRout 所提到的:从列表中删除项目是一个众所周知的陷阱:当您从列表的开头开始并继续时,您可能不会删除所有需要的项目。因此,您需要从列表的末尾开始并以相反的方向遍历列表。 :-)
  • @SiddharthRout,我可以知道步骤 -1 是什么意思吗?抱歉,我对 VBA 比较陌生。

标签: excel vba for-loop


【解决方案1】:

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

' ... 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 ...

【讨论】:

  • 我试过你的代码,但我在最后一行遇到了“运行时错误'424':需要对象”
  • @OliverTheseira 出现错误是因为你没有复制第一行Dim toDel As Range
  • 如果跳过Dim toDel As Range这一行,则toDel隐式声明为Variant,初始值为Empty,如果没有找到适合删除的行,则toDel的值为Empty,导致一个错误。如果声明Dim toDel As Range,则toDel的初始值为Nothing,如果没有找到适合删除的行,则不满足条件`If Not toDel Is Nothing`,不会尝试删除行从空范围。
  • 多么奇特,我确实将它包含在我的变量声明列表中,位于我的其余代码之上,但它不起作用。根据您的回答将其移下后,它可以正常工作。你能向我解释为什么会这样吗?另外,为什么在我上面的变量声明列表中声明“单元格为范围”可以正常工作。
  • @OliverTheseira 很可能,你声明了用逗号分隔的变量,不要在每个后面指定类型:Dim toDel, cell as Range。 VBA 将其解释为:Dim toDel as Variant, cell as Range。像这样声明变量:Dim toDel as Range, cell as Range
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多