我正在处理包含竞争数据的报告,并且我正在尝试删除列中的单元格D
与不同工作表中指定的字符串列表不匹配的任何行。到目前为止,这就是我所拥有的,虽然它有效,但速度非常慢。有没有更快或更有效的方法来做到这一点?
Dim product As String
Dim TempArray as Variant
Dim idArray() As Variant
Dim myTable As ListObject
Sub rambler()
Application.ScreenUpdating = False
populatingArrays
filterID
Application.ScreenUpdating = True
End Sub
Sub populatingArrays()
Sheets("Competitive Set").Activate
Set myTable = ActiveSheet.ListObjects("Table1")
TempArray = myTable.DataBodyRange.Columns(1)
idArray = Application.Transpose(TempArray)
End Sub
Sub filterID()
Sheets("Report").Activate
ActiveSheet.Range("D2").Activate
Do While ActiveCell.Value <> ""
product = ActiveCell.Value
IsInArray = UBound(Filter(idArray, product))
If UBound(Filter(idArray, product)) < 0 Then
ActiveCell.EntireRow.Delete
Else
Selection.Offset(1, 0).Select
End If
Loop
ActiveSheet.Name = "I&D Data"
ActiveSheet.Range("A1").Select
End Sub
注意:我知道我不应该使用 Activate 和 Select,但我不知道如何在没有它们的情况下进行这项工作。另一件事,这段代码是部分复制粘贴的,我不确定是什么IsInArray
或做什么,但是当我删除该行时,所有行都会被删除。
首先,我没有看到使用全局变量的理由。让我们将它们的范围限定到它们各自的潜艇。
其次,假设您的“报告”表中有数据D2:D100
,其中单元格D101
是第一个空单元格。因此,你通过一系列努力环D2
到D100
,如果应用过滤器检查。
第三,我将参数传递给 subs 以尽可能保持范围本地化。(我也在没有测试的情况下这样做,但我认为它应该有效......)
如果这是正确的,我认为这对您来说应该运行得更快:
Option Explicit 'Forces you to declare all variables. This goes at the very top of the Module.
Sub rambler()
dim myArr as Variant
Application.ScreenUpdating = False
myArr = populatingArrays
filterID(myArr)
Application.ScreenUpdating = True
End Sub
Function populatingArrays() as Variant
Dim idArray() As Variant
Dim TempArray As Variant
Set myTable = Sheets("Competitive Set").ListObjects("Table1")
TempArray = myTable.DataBodyRange.Columns(1)
idArray = Application.Transpose(TempArray)
populatingArrays = idArray
End Sub
Sub filterID(arr as Variant)
Dim product As String
Dim myTable As ListObject
Dim lastRow As Long, i As Long
With Sheets("Report")
lastRow = .Cells(Rows.Count, "D").End(xlUp).Row
For i = lastRow To 1 Step -1 ' Deleting rows: it's best to start at the end and work up.
product = .Cells(i, "D").Value
IsInArray = UBound(Filter(arr, product))
If IsInArray < 0 Then
.Rows(i).EntireRow.Delete
End If
Next i
.Name = "I&D Data"
End Sub
编辑:看看您是否能理解我如何删除.Select
. 此外,学习/理解的一件好事是如何将参数传递给子例程。我还将 the 更改Sub populatingArrays()
为 a Function
,这允许我们返回一些值(而对于Sub
, 要执行相同的操作,您需要一个全局变量)。逐步完成这个F8应该有助于了解它是如何工作的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句