【问题标题】:VBA search for values and delete from list (for loop is too slow)VBA 搜索值并从列表中删除(for 循环太慢)
【发布时间】:2018-12-10 13:57:45
【问题描述】:

我每周都会收到一份 Excel 文档,其中列出了尚未完成我们正在获得的新 IT 系统培训的员工名单。但是,培训并不是对每个人都有用,所以我需要清理才能得到真实的数字。

我已经列出了与培训无关的员工列表(Oprydning),并使用以下代码一次搜索一个名称并从另一个列表中删除(Datagrundlag)。

Private Sub RydOpKnap_Click()
Dim OprydningAntal As Long
Dim DataAntal As Long
Dim Find As String

Worksheets("Datagrundlag - endelig").Visible = True

OprydningsAntal = Worksheets("Oprydning").UsedRange.Rows.Count
DataAntal = Worksheets("Datagrundlag - endelig").UsedRange.Rows.Count

  Dim r, s As Long
    For r = 2 To OprydningsAntal
        Find = Worksheets("Oprydning").Cells(r, 1).Value
            For s = 2 To DataAntal


                If Worksheets("Datagrundlag - endelig").Cells(s, 3).Value = Find Then
                    Worksheets("Datagrundlag - endelig").Cells(s, 3).EntireRow.Delete
            Exit For
            End If
            Next s
    Next r

    Worksheets("Datagrundlag - endelig").Visible = False

    ActiveWorkbook.RefreshAll

End Sub

但这需要很长时间,因为不相关员工的列表目前有 460 个不同的值(并且会变得更大)。还有另一种方法可以做到这一点吗?我对 VBA 很陌生,但是可以使用数组吗?启动代码的“命令按钮”是否会使其变慢?

提前致谢!

海蒂

【问题讨论】:

  • 从您当前的非相关人员列表中创建一个数组,并将其用于使用 xlFilterValues 进行自动过滤。删除可见行并移除过滤器。

标签: excel vba for-loop search delete-row


【解决方案1】:

从您当前的非相关人员列表中创建一个数组,并将其用于使用 xlFilterValues 进行自动过滤。删除可见行并移除过滤器。

Option Explicit

Private Sub RydOpKnap_Click()
    Dim i As Long, j As Long

    ReDim notRelevant(0) As Variant

    With Worksheets("Oprydning")
        For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
            ReDim Preserve notRelevant(i-2)
            notRelevant(i - 2) = .Cells(i, "A").Value
        Next i
    End With

    With Worksheets("Datagrundlag - endelig")
        .Visible = True

        If .AutoFilterMode Then .AutoFilterMode = False
        With .Range(.Cells(1, "C"), .Cells(.Rows.Count, "C").End(xlUp))
            .AutoFilter field:=1, Criteria1:=(notRelevant), Operator:=xlFilterValues
            .Offset(1, 0).EntireRow.Delete
        End With
        .AutoFilterMode = False

        .Visible = False
        .Parent.RefreshAll
    End With

End Sub

【讨论】:

  • 太棒了,谢谢你的代码。我有点挣扎如何设置它。显式选项有什么作用?我收到一条错误消息,指出 Range 类的方法删除失败。你知道怎么解决吗?
  • Option Explicit 强制您声明所有变量。我需要一点时间来设置一个全文工作台。
  • 啊,我明白了!好的谢谢。我也有点想尝试自己修复它 :-) 非常感谢您的帮助!
  • 我的错。我试图在整列上偏移 1 行。我已经在上面调整了。
  • 该死的,它有效!大约需要 3 秒。再次感谢!
【解决方案2】:

还有其他方法吗?

是的,使用条件格式为要排除的eg 着色,并过滤以删除带有格式化单元格的行。

【讨论】:

  • 有趣!难道我也必须使用数组来查找不相关人员的姓名并为它们着色吗?
猜你喜欢
  • 1970-01-01
  • 2016-01-01
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多