[英]excel vba - Select all filtered rows except header after autofilter
我正在嘗試編寫一個宏來執行以下操作:
我試着這樣寫:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A:A")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
copy_filter Target
End If
End Sub
Sub copy_filter(Changed)
Set sh = Worksheets("Sheet2")
sh.Select
sh.Range("$A$1:$L$5943") _
.AutoFilter Field:=3, _
Criteria1:="=" & Changed.Value, _
VisibleDropDown:=False
Set rang = sh.Range("$A$1:$L$5943") _
.SpecialCells(xlCellTypeVisible)
rang.Offset(0, 0).Select
Selection.Copy
Worksheets("Sheet1").Select
Worksheets("Sheet1").Range(Changed.Address).Offset(0, 1).Select
Selection.PasteSpecial Paste:=xlPasteValues
sh.Range("$A$1:$L$5943").AutoFilter
Application.CutCopyMode = False
End Sub
但是,當我復制選擇內容時,標題行也會被復制,但是使用.Offset(1,0)會剪切標題和其他1行,並且不會考慮過濾器未返回任何結果的情況。
如何選擇除標題以外的所有已過濾行?
使用sh.UsedRange
將為您提供動態范圍。 而sh.Range("$A$1:$L$5943")
不會縮小和增長以匹配您的數據集。
我們可以這樣修剪標題行:
Set rang = sh.UsedRange.Offset(1, 0)
Set rang = rang.Resize(rang.Rows.Count - 1)
但是SpecialCells(xlCellTypeVisible)
會拋出No cells were found.
如果沒有數據可返回,則返回錯誤。 因此,我們必須捕獲這樣的錯誤:
On Error Resume Next
Set rang = rang.SpecialCells(xlCellTypeVisible)
If Err.Number = 0 Then
End If
On Error GoTo 0
Sub copy_filter(Changed) Dim rang As Range Set sh = Worksheets("Sheet2") sh.UsedRange.AutoFilter Field:=3, _ Criteria1:="=" & Changed.Value, _ VisibleDropDown:=False Set rang = sh.UsedRange.Offset(1, 0) Set rang = rang.Resize(rang.Rows.Count - 1) On Error Resume Next Set rang = rang.SpecialCells(xlCellTypeVisible) If Err.Number = 0 Then rang.Copy Worksheets("Sheet1").Range(Changed.Address).Offset(0, 1).PasteSpecial Paste:=xlPasteValues End If On Error GoTo 0 sh.Cells.AutoFilter Application.CutCopyMode = False End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.