0

I have 2 columns and 300k rows

F1  21
F2  32
F3  43
F4  4565
F5  76
F6  76
F7  5
F8  4
F9  4332
…   …

The first column has 300 different values, and I want to delete all rows which contain specific values. Currently I have;

Sub DeleteRowsBasedOnCondition()
N = Cells(Rows.Count, 1).End(xlUp).Row
For i = N To 1 Step -1
    If Cells(i, 1).Value = "F1" Then Rows(i).Delete
Next i
End Sub

and it removes a single conndition (F1), but this will take a long time to delete 56 conditions.

I have a named list, toRemove, which contains all the fields I want to remove. ie (F1, F2, F4, F9). I would like to refer to this named list instead of running the code 56 times.

I would like

Sub DeleteRowsBasedOnCondition()
N = Cells(Rows.Count, 1).End(xlUp).Row
For i = N To 1 Step -1
    If Cells(i, 1).Value has a value in the array toRemove
    Then Rows(i).Delete
Next i
End Sub

I tried How to search for string in an array post, but get the following error when referring to the line

function Filter(arr, stringToBeFound):
Run-Time error '13':

Type mismatch

Here is the code I tried:

Sub DeleteRowsBasedOnArrayCondition()
' toremove is a named list of values which are to be compared with and deleted from table
N = Cells(Rows.Count, 1).End(xlUp).Row
For i = N To 1 Step -1
    If IsInArray(Cells(i, 2).Value, toremove) Then Rows(i).Delete
Next i
End Sub

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
braX
  • 11,506
  • 5
  • 20
  • 33
frank
  • 3,036
  • 7
  • 33
  • 65

1 Answers1

0

Following brainac's suggestion, I filtered by toRemove list, then deleted the rows.

Sub DeleteRowsBasedOnCondition()
For Each i In Worksheets("Sheet2").Range("toRemove")
    Range("a1").Select
    ActiveSheet.Range("$A$1:$c$9").AutoFilter Field:=1, Criteria1:=i
    LR = Cells(Rows.Count, 1).End(xlUp).Row
    Range("A2:A" & LR).SpecialCells(xlCellTypeVisible).Select
    Selection.EntireRow.Delete
Next i
ActiveSheet.ShowAllData

End Sub
frank
  • 3,036
  • 7
  • 33
  • 65