【问题标题】:I don't get it (vba only works for half the columns) [duplicate]我不明白(vba 仅适用于一半的列)[重复]
【发布时间】:2021-07-02 15:38:51
【问题描述】:

我。做。不是。了解。

我正在尝试根据值删除行(目标位于第 11 列)。 此代码仅适用于我要删除的一半单元格,因此我必须运行它 10 次(从 520 到 260,然后是 130、65...)

我的代码看起来很简单,但我仍然无法弄清楚问题出在哪里......

感谢您的帮助

Dim Target As String, i As Integer
Target = "Réduction ligne"
lastrow = Cells(Rows.Count, 11).End(xlUp).Row
For i = 1 To lastrow
    On Error Resume Next
    If Cells(i, 11).Value = Target Then
    Rows(i).EntireRow.Delete = True
   End If
Next i

【问题讨论】:

  • 你应该向后迭代。否则引用将丢失...更好/更快的方法是将要删除的行中的所有单元格放在(Union)范围中,然后立即删除其 EntireRow。
  • 做一个反向循环For i = lastrow to 1 Step -1
  • 另外,您不需要循环来删除包含“Réduction ligne”的行。使用AUTOFILTER。它要快得多。
  • 在 SO 上经常被回答,例如在...Delete entire row
  • 哇,感谢您的快速回复,我是 vba 新手,所以我仍然无法优化我的宏

标签: excel vba


【解决方案1】:

先说最重要的:

On Error Resume Next

请不要那样做。这将使调试代码成为一场噩梦。


为什么会出现您的问题:

现在,让我们看看问题的根源。您有以下行:

1 A
2 B
3 C
4 D

在您的第一次循环迭代中i = 1。行1 被删除。现在您的数据如下所示:

1 B
2 C
3 D

在您的第二次循环迭代中i = 2。由于第 1 行已被删除,您实际上正在查看第三原始行。


我该如何解决这个问题:

这个问题可以通过向后迭代来解决:

For i = lastrow To 1 Step -1

【讨论】:

  • 一旦你理解了这个函数是如何工作的,那就很有意义了,谢谢你的提示
【解决方案2】:

请尝试下一个代码:

Sub efficientDeleteRows()
  Dim Target As String, lastRow As Long, i As Long, rngDel As Range
 Target = "Réduction ligne"
 lastRow = cells(rows.count, 11).End(xlUp).row
 For i = 1 To lastRow
    If cells(i, 11).value = Target Then
        If rngDel Is Nothing Then
            Set rngDel = cells(i, 11)
        Else
            Set rngDel = Union(rngDel, cells(i, 11))
        End If
    End If
 Next i
 If Not rngDel Is Nothing Then rngDel.EntireRow.Delete
End Sub

【讨论】:

  • 我会试一试,谢谢
猜你喜欢
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 2020-07-20
  • 1970-01-01
  • 2016-02-29
  • 2017-08-12
相关资源
最近更新 更多