Excel VBA搜索值并从列表中删除(for循环太慢)
我每周都会收到一份Excel文档,其中列出了尚未完成新IT系统培训的员工名单。然而,培训对每个人都不相关,所以我需要整理一下,以获得真实的数字 我已经列出了与培训无关的员工名单(Oprydning),并使用以下代码一次搜索一个姓名,然后从另一个名单中删除(Datagrundlag) 不过,这需要很长时间,因为不相关的员工名单目前有460个不同的值(而且会越来越大)。还有别的办法吗?我对VBA很陌生,但是否可以使用数组?启动代码的“命令按钮”是否会使代码变慢 提前谢谢Excel VBA搜索值并从列表中删除(for循环太慢),excel,vba,for-loop,search,delete-row,Excel,Vba,For Loop,Search,Delete Row,我每周都会收到一份Excel文档,其中列出了尚未完成新IT系统培训的员工名单。然而,培训对每个人都不相关,所以我需要整理一下,以获得真实的数字 我已经列出了与培训无关的员工名单(Oprydning),并使用以下代码一次搜索一个姓名,然后从另一个名单中删除(Datagrundlag) 不过,这需要很长时间,因为不相关的员工名单目前有460个不同的值(而且会越来越大)。还有别的办法吗?我对VBA很陌生,但是否可以使用数组?启动代码的“命令按钮”是否会使代码变慢 提前谢谢 Heidi从当前的非相关员工
Heidi从当前的非相关员工列表中创建一个数组,并使用它使用XLFilterValue进行自动筛选。删除可见行并删除筛选器
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
还有别的办法吗
是的,使用条件格式为要排除的行着色,使用过滤器删除带有格式单元格的行
从当前的非相关员工列表中创建一个数组,并使用它使用XLFilterValue进行自动筛选。删除可见行并删除过滤器。太棒了,谢谢你的代码。我有点纠结于如何设置它。该选项的作用是什么?我收到一个错误,表示Range类的方法Delete失败。您知道如何解决这个问题吗?OptionExplicit强制您声明所有变量。我会花一点时间来建立一个完整的文本工作台。啊,我明白了!好的,谢谢。我也有点想试着自己解决它:-)非常感谢你的帮助!我的错。我试图在整列上向下偏移1行。我已经在上面调整过了。该死的,它工作了!大概需要3秒钟。再次感谢!有趣!难道我不需要使用数组来查找不相关员工的姓名并为其上色吗?
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