Home » excel » excel – VBA search for values and delete from list (for loop is too slow)

excel – VBA search for values and delete from list (for loop is too slow)

Posted by: admin May 14, 2020 Leave a comment


I get an Excel document sent each week with a list of employees that haven’t completed training for a new IT-system we’re getting. However, the training is not relevant for everyone, so I need to clean up in order to get the real numbers.

I have made a list of the employees which training is not relevant for (Oprydning), and use the following code to search for one name at a time and delete from the other list (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


End Sub

This takes forever though, since the list of not-relevant employees is currently 460 different values (and will get bigger). Is there another way to do this? I’m quite new to VBA, but would it be possible to use an array? Does the “Command Button” that initiates the code, make it slower?

Thanks in advance!


How to&Answers:

Create an array from your current list of non-relevant staff and use it to AutoFilter with xlFilterValues. Delete visible rows and remove filter.

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
    End With

End Sub


Is there another way to do this?

Yes, use Conditional Formatting to colour those to be excluded eg, and filter to delete the rows with formatted cells.

SO53707228 example