Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA搜索值并从列表中删除(for循环太慢)_Excel_Vba_For Loop_Search_Delete Row - Fatal编程技术网

Excel VBA搜索值并从列表中删除(for循环太慢)

Excel VBA搜索值并从列表中删除(for循环太慢),excel,vba,for-loop,search,delete-row,Excel,Vba,For Loop,Search,Delete Row,我每周都会收到一份Excel文档,其中列出了尚未完成新IT系统培训的员工名单。然而,培训对每个人都不相关,所以我需要整理一下,以获得真实的数字 我已经列出了与培训无关的员工名单(Oprydning),并使用以下代码一次搜索一个姓名,然后从另一个名单中删除(Datagrundlag) 不过,这需要很长时间,因为不相关的员工名单目前有460个不同的值(而且会越来越大)。还有别的办法吗?我对VBA很陌生,但是否可以使用数组?启动代码的“命令按钮”是否会使代码变慢 提前谢谢 Heidi从当前的非相关员工

我每周都会收到一份Excel文档,其中列出了尚未完成新IT系统培训的员工名单。然而,培训对每个人都不相关,所以我需要整理一下,以获得真实的数字

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

不过,这需要很长时间,因为不相关的员工名单目前有460个不同的值(而且会越来越大)。还有别的办法吗?我对VBA很陌生,但是否可以使用数组?启动代码的“命令按钮”是否会使代码变慢

提前谢谢


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