При удалении таких строк вам нужно работать в обратном направлении.Попробуйте:
For i = wantedRange.Rows.Count To 1 Step -1
ПРИМЕЧАНИЕ A : В VBA все размеры должны быть в верхней части модуля.
ПРИМЕЧАНИЕ B : Циклхорошо, но если вы хотите повысить эффективность или у вас есть много строк для поиска, тогда вместо цикла используйте автофильтр с формулой, а затем удалите видимые строки.
ПРИМЕЧАНИЕ C : при работе со строками используйтеlong вместо целого числа, чтобы предотвратить переполнение, поэтому в вашем случае:
Dim i As Long
ПРИМЕЧАНИЕ D : Как упомянул Тим выше.
Вот некоторые изменения, которые могутhelp:
Dim sDropDown As String
Dim lRowCnt As Long
sDropDown = Left(Sheets("B").Range("L1").Value, 3)
With Sheets("A").Range("E11:E200")
For lRowCnt = .Rows.Count To 1 Step -1
If Not (.Rows(lRowCnt).Value Like "*" & sDropDown "*") Then
.Rows(lRowCnt).Delete
End If
Next i
Sheets("B").Resize(.Rows.Count, .Columns.Count).Value = .Value
End With
Пример метода автофильтрации:
Dim sFilter As String
sFilter = "<>*" & Left(Sheets("B").Range("L1").Value, 3) & "*"
Application.ScreenUpdating = False
With Sheets("A").Range("E11:E200")
.Offset(-1, 0).Resize(.Rows.Count + 1).AutoFilter Field:=1, Criteria1:=sFilter, Operator:=xlAnd
.EntireRow.Delete
.Parent.AutoFilterMode = False
Sheets("B").Cells(1, 1).Resize(.Rows.Count, 1).Value = .Value '// Output
End With
Application.ScreenUpdating = True