Отличный трюк с VBA в том, что вы можете ссылаться на определенные ячейки, которые имеют свойство, используя .SpecialCells
, в вашем случае вы захотите использовать xlCellTypeVisible
, но есть много других, которые можно использовать.
Хитрость заключается в том, чтобы сделать разрез вручную.Вы не можете вырезать ячейки, которые не находятся рядом друг с другом, но вы можете скопировать и вставить их.Таким образом, идея состоит в том, чтобы вставить ячейки BFL ниже ячеек PFL, а затем очистить исходные ячейки и очистить пробелы.После применения автофильтра вы можете сказать Excel, чтобы он смотрел только на видимые ячейки в том же диапазоне, который вы указали ранее, так что вы не получите ничего лишнего.Это важно, потому что когда вы собираетесь очистить все видимые ячейки, вы не хотите случайно очистить ячейки, которые вы только что вставили ниже.
Когда вы очищаете пустые ячейки, важно идти снизу вверх, потому что в противном случае вы можете столкнуться с проблемами индексации.Вы также заметите, что я использую .entirerow
, чтобы он удалял всю строку, а не только первый столбец.
Чтобы показать все данные, вы просто идете Worksheet.showalldata
, НО вам нужно проверить, есть ли на листе автофильтр.Время от времени, когда вы выполняете такие операции, как очистка ячеек, он отключает автофильтр, поэтому лучше проверить, работает ли он по-прежнему или нет, чтобы ваш макрос не выдавал ошибку.
Последний крошечныйвещь, хотя вы не ошибаетесь, нет необходимости объединять строку с подстановочным знаком *
, вы можете просто поместить их в одну строку.например."BFL*"
против "BFL" & "*"
просто экономит немного времени при наборе текста.
Sub test()
Dim LR1 As Long
Dim BFLRange As Range
LR1 = Range("A" & Rows.Count).End(xlUp).Row
Dim i As Long
With Worksheets("Combined")
With .Range("A2:AU" & LR1)
.AutoFilter Field:=1, Criteria1:="BFL" & "*"
Set BFLRange = .SpecialCells(xlCellTypeVisible)
BFLRange.Copy Destination:=Worksheets("Combined").Range("A" & LR1 + 1)
End With
BFLRange.Clear
For i = LR1 To 2 Step -1
If IsEmpty(.Cells(i, 1)) Then
.Cells(i, 1).EntireRow.Delete shift:=xlUp
End If
Next i
If .AutoFilterMode Then
.ShowAllData
End If
End With
End Sub
Этот фрагмент следует предложению @ SJR, где вы удаляете всю используемую область, содержащую BFL.Причина, по которой я отключил оповещения, заключается в том, что появляется только небольшое текстовое поле с вопросом, действительно ли вы хотите удалить строки листа.Отключая его, он не требует никакого пользовательского ввода.Хорошо отметить, что, удаляя ячейки сразу, это значительно ускорит макрос, если вы работаете с большим количеством данных.Еще раз спасибо @ SJR.
Sub test()
Dim LR1 As Long
Dim BFLRange As Range
LR1 = Range("A" & Rows.Count).End(xlUp).Row
Dim i As Long
With Worksheets("Combined")
With .Range("A2:AU" & LR1)
.AutoFilter Field:=1, Criteria1:="BFL" & "*"
Set BFLRange = .SpecialCells(xlCellTypeVisible)
BFLRange.Copy Destination:=Worksheets("Combined").Range("A" & LR1 + 1)
End With
Application.DisplayAlerts = False
BFLRange.Delete
Application.DisplayAlerts = True
' For i = LR1 To 2 Step -1
' If IsEmpty(.Cells(i, 1)) Then
' .Cells(i, 1).EntireRow.Delete shift:=xlUp
' End If
' Next i
If .AutoFilterMode Then
.ShowAllData
End If
End With
End Sub