Отредактированный новый ответ:
Я проверил ваш код, и, если я понимаю, ваша реальная цель - очистить отфильтрованные строки от C
до N
(то есть строки, в которых ячейка в столбце D
говорит "Active"
. уже удалось очистить столбцы C
до J
, отсюда и вопрос.
Предлагаемое мной решение очищает все содержимое строк C
до N
за один раз, промежуточный шаг не требуется. Поскольку интересующие строки уже определены, нет необходимости в условии If... Then
.
Очистка ячейки происходит после операции копирования.
Поскольку мне не очень удобно с Resize, Offset
и Cells
, предлагаемое решение использует разные функции, но должно работать одинаково.
Вот оно:
Const cCrit As Variant = "D" ' Criteria Column Letter/Number
Const cCols As String = "C:J" ' Source/Target Data Columns
Const cFRsrc As Long = 15 ' Source First Row
Sub test()
Dim ws1 As Worksheet ' Source Workbook
Dim ws2 As Worksheet ' Target Workbook
Dim rng As Range ' Filter Range, Copy Range
Dim rngClear As Range ' Range to be cleared after copy
Dim lRow As Long ' Last Row Number
Dim FRtgt As Long ' Target First Row
Dim Answer As VbMsgBoxResult ' Message Box
Dim Error1 As VbMsgBoxResult ' Message Box for Errors
' Create references to worksheets.
With ThisWorkbook
Set ws1 = .Worksheets("Feuil1")
Set ws2 = .Worksheets("Feuil2")
End With
Answer = MsgBox("Do you want to run the Macro?", vbYesNo, "Run Macro")
If Answer <> vbYes Then Exit Sub
' In Source Worksheet
With ws1
' Clear any filters.
.AutoFilterMode = False
' Calculate Last Row.
lRow = .Cells(.Rows.Count, cCrit).End(xlUp).Row
' Calculate Filter Column Range.
Set rng = .Cells(cFRsrc, cCrit).Resize(lRow - cFRsrc + 1)
' Make an offset for the filter to start a row before (above) and
' end a row after (below).
With rng.Offset(-1).Resize(lRow - cFRsrc + 3)
' Filter data in Criteria Column.
.AutoFilter Field:=1, Criteria1:="Active"
End With
' Create a reference to the Copy Range.
Set rng = .Columns(cCols).Resize(rng.Rows.Count).Offset(cFRsrc - 1) _
.SpecialCells(xlCellTypeVisible)
'Set here the range to be cleared after the copy. Same rows as rng, but with extended columns (C to N)
Set rngClear = .Range("C" & cFRsrc & ":" & "N" & lRow).SpecialCells(xlCellTypeVisible)
' Clear remaining filters.
.AutoFilterMode = False
End With
' Calculate Target First Row.
FRtgt = ws2.Cells(ws2.Rows.Count, cCrit).End(xlUp).Row + 1
' Copy Range and paste to Target Worksheet and clear contents of future project hopper
rng.Copy
ws2.Columns(cCols).Resize(1).Offset(FRtgt - 1).PasteSpecial xlPasteValues
Application.CutCopyMode = False
'Clears columns C to N in ws1 for copied rows
rngClear.ClearContents
End Sub
Вы можете улучшить этот код, используя переменные для "C","N"
.
Старый ответ:
Небольшой код, который может помочь:
If IsEmpty(Range("C30:D30")) Then
Range("K30:N30").ClearContents
Endif
С этого момента вам необходимо выполнить цикл для заданного диапазона (для этого вы, вероятно, можете использовать lrow
или rng.Rows.Count
).
Исходя из того, что я понимаю из кода, он берет диапазон данных в листе ("Future Project Hopper"), фильтрует их и копирует в лист "CPD-Carryover, Complete & Active".
Если вы хотите очистить последний, ваш дополнительный код должен быть помещен в конце, до или после rng.Rows.ClearContents
.