У меня есть длинный файл excel, из которого мне нужно удалить целые строки, содержащие определенные значения в столбце A. Столбец содержит значения от [PAR001 до PAR0023247], и мне нужно удалить те, которые попадают в диапазон от [PAR002537 до PAR005214]. Какой самый быстрый способ сделать это?
Попробуйте выполнить поиск по диапазону для «PAR» и используйте метод val() для сравнения различных длин целых чисел без необходимости искать «0», который может быть частью целого числа справа.
Важно считать диапазон в обратном порядке. Кроме того, если у вас есть какие-либо ячейки, начинающиеся с «PAR» над рассматриваемым списком, могут возникнуть проблемы.
Это сработало для меня. Я надеюсь, что это работает для вас.
Public Sub DeleteRows()
Dim arr As Range
Dim tester As String
Dim NumElements As Long
Set arr = Range(Range("A1"), Cells(Rows.Count, 1).End(xlUp))
NumElements = arr.Cells.Count
For i = NumElements To 1 Step -1
If Left(arr(i), 3) = "PAR" Then
tester = Right(arr(i), Len(arr(i)) - 3)
If Val(tester) >= 2537 And Val(tester) <= 5214 Then
Cells(i, 1).EntireRow.Delete
End If
End If
Next i
End Sub
Чисто и легко. Проголосовал за
Спасибо Доминик. Я увидел это после того, как разместил пост, и забеспокоился, что просто испорчу формат, если вернусь. Первый постер!
Честно говоря, я думаю, что ответ @ haplo76 довольно хорош.
Мой ответ будет работать ТОЛЬКО, если ваши данные отсортировано по возрастанию по этим значениям PARxxxx. Если нет, то используйте ответ @ haplo76
Единственное преимущество этого решения заключается в том, что вам не нужно зацикливаться и удалять все строки в одной строке кода.
В моем тесте я удалил строки [от PAR03 до PAR010].
Sub TEST()
Dim i_row As Long
Dim e_row As Long
'In e_row you want to match the value AFTER the last one you want to to delete
' so if you want to delete from PAR003 to PAR010
' i_row will search for PAR003 but e-row need to search for PAR011!!!
With Application.WorksheetFunction
i_row = .Match("PAR003", Range("A:A"), 0)
e_row = .Match("PAR011", Range("A:A"), 0)
End With
Range("A" & i_row & ":A" & e_row).Delete
End Sub
После выполнения кода я получаю:
Еще одним преимуществом является то, что вы можете легко преобразовать эту подпрограмму в общую, требующую удаления только значений PARxx:
Sub TEST()
DELETE_ROWS "PAR003", "PAR011" 'this will delete [PAR003 to PAR010]
End Sub
Sub DELETE_ROWS(ByVal ini_val As String, end_val As String)
Dim i_row As Long
Dim e_row As Long
With Application.WorksheetFunction
i_row = .Match(ini_val, Range("A:A"), 0)
e_row = .Match(end_val, Range("A:A"), 0)
End With
Range("A" & i_row & ":A" & e_row).Delete
End Sub
Но, как я сказал вначале, это будет работать, только если ваши данные отсортированы в столбце A и в порядке возрастания. Кроме того, если вы введете значение «PAR00xx», которое не найдено, возникнет ошибка.
Поскольку выбирать не нужно, я удалил соответствующие строки кода.