按条件过滤然后复制并粘贴到同一工作表的底部
filter on criteria then copy and paste at bottom of same worksheet
我是 VBA 的新手,经过大量搜索后,我无法让代码正常工作。我正在尝试 filter/select B 列中值为 313 且 C 列中值为 1 或 2 的任何内容,然后使用同一工作表底部所有列 (A-N) 中的数据复制所有相关行。工作表没有固定的行数,并且 313 并不总是在同一组单元格中。我尝试了以下方法,但代码似乎粘贴在 'A2' 中,而不是底部的选择。任何帮助将不胜感激。
Sub CopyPartOfFilteredRange()
Dim ws1 As Worksheet
Dim filterRange As range
Dim copyRange As range
Dim lastRow As Long
Set ws1 = ThisWorkbook.Sheets("Sheet 1")
ws1.AutoFilterMode = False
lastRow = ws1.range("A" & ws1.Rows.Count).End(xlUp).Row
Set filterRange = ws1.range("A1:N" & lastRow)
Set copyRange = ws1.range("A2:N" & lastRow)
filterRange.AutoFilter Field:=2, Criteria1:="313"
filterRange.AutoFilter Field:=3, Criteria1:="=1", _
Operator:=xlAnd, Criteria2:="=2"
lastRow = ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
ws1.Cells(lastRow, 1).Select
ws1.Paste
ws1.AutoFilterMode = False
End Sub
我相信因为您正在重新定义过滤器后的最后一行,所以使用 xlUp
会错过最后一行,因为它可能隐藏在过滤器中。我建议使用
lastRow = lastRow + 1
因为您已经定义了范围的最后一行,而您只想越过该范围的下一行。
顺便说一句,你的第二个过滤器将不过滤任何东西,因为没有单元格会同时等于 1 和等于 2。不确定你想要什么。无论如何,就像我在评论中所说的,我不相信你在复制任何东西,所以你需要
filterRange.Copy
过滤后。我不确定我是否会推荐像这样复制和粘贴,但我将尝试只修改您的代码而不是重写它。
另外,我不相信
Set copyRange = ws1.range("A2:N" & lastRow)
根本不需要,可以删除。
这是我的全部
Sub CopyPartOfFilteredRange()
Dim ws1 As Worksheet
Dim filterRange As Range
Dim lastRow As Long
Set ws1 = Worksheets("Sheet1")
ws1.AutoFilterMode = False
lastRow = ws1.Range("A" & ws1.Rows.Count).End(xlUp).Row
Set filterRange = ws1.Range("A1:N" & lastRow)
filterRange.AutoFilter Field:=2, Criteria1:="313"
filterRange.Copy
lastRow = lastRow + 1
ws1.Cells(lastRow, 1).Select
ws1.Paste
ws1.AutoFilterMode = False
End Sub
你必须:
把xlAnd
改成xlOr
增加 lastRow
以引用要粘贴的单元格
使用 SpecialCells(xlCellTypeVisible)
来 select 过滤单元格(如果有的话!)
试试他的
Option Explicit
Sub CopyPartOfFilteredRange()
Dim lastRow As Long
With ThisWorkbook.Sheets("Sheet 1")
.AutoFilterMode = False
lastRow = .Range("A" & .Rows.Count).End(xlUp).row
With .Range("A1:N" & lastRow)
.AutoFilter Field:=2, Criteria1:="313"
.AutoFilter Field:=3, Criteria1:="1", Operator:=xlOr, Criteria2:="2"
If Application.WorksheetFunction.Subtotal(103, .Cells.Resize(, 1)) > 1 Then 'count visible cells in column "A" other than the header
.Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy .Cells(lastRow + 1, 1)
End If
End With
.AutoFilterMode = False
End With
End Sub
我是 VBA 的新手,经过大量搜索后,我无法让代码正常工作。我正在尝试 filter/select B 列中值为 313 且 C 列中值为 1 或 2 的任何内容,然后使用同一工作表底部所有列 (A-N) 中的数据复制所有相关行。工作表没有固定的行数,并且 313 并不总是在同一组单元格中。我尝试了以下方法,但代码似乎粘贴在 'A2' 中,而不是底部的选择。任何帮助将不胜感激。
Sub CopyPartOfFilteredRange()
Dim ws1 As Worksheet
Dim filterRange As range
Dim copyRange As range
Dim lastRow As Long
Set ws1 = ThisWorkbook.Sheets("Sheet 1")
ws1.AutoFilterMode = False
lastRow = ws1.range("A" & ws1.Rows.Count).End(xlUp).Row
Set filterRange = ws1.range("A1:N" & lastRow)
Set copyRange = ws1.range("A2:N" & lastRow)
filterRange.AutoFilter Field:=2, Criteria1:="313"
filterRange.AutoFilter Field:=3, Criteria1:="=1", _
Operator:=xlAnd, Criteria2:="=2"
lastRow = ws1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
ws1.Cells(lastRow, 1).Select
ws1.Paste
ws1.AutoFilterMode = False
End Sub
我相信因为您正在重新定义过滤器后的最后一行,所以使用 xlUp
会错过最后一行,因为它可能隐藏在过滤器中。我建议使用
lastRow = lastRow + 1
因为您已经定义了范围的最后一行,而您只想越过该范围的下一行。
顺便说一句,你的第二个过滤器将不过滤任何东西,因为没有单元格会同时等于 1 和等于 2。不确定你想要什么。无论如何,就像我在评论中所说的,我不相信你在复制任何东西,所以你需要
filterRange.Copy
过滤后。我不确定我是否会推荐像这样复制和粘贴,但我将尝试只修改您的代码而不是重写它。
另外,我不相信
Set copyRange = ws1.range("A2:N" & lastRow)
根本不需要,可以删除。
这是我的全部
Sub CopyPartOfFilteredRange()
Dim ws1 As Worksheet
Dim filterRange As Range
Dim lastRow As Long
Set ws1 = Worksheets("Sheet1")
ws1.AutoFilterMode = False
lastRow = ws1.Range("A" & ws1.Rows.Count).End(xlUp).Row
Set filterRange = ws1.Range("A1:N" & lastRow)
filterRange.AutoFilter Field:=2, Criteria1:="313"
filterRange.Copy
lastRow = lastRow + 1
ws1.Cells(lastRow, 1).Select
ws1.Paste
ws1.AutoFilterMode = False
End Sub
你必须:
把
xlAnd
改成xlOr
增加
lastRow
以引用要粘贴的单元格使用
SpecialCells(xlCellTypeVisible)
来 select 过滤单元格(如果有的话!)
试试他的
Option Explicit
Sub CopyPartOfFilteredRange()
Dim lastRow As Long
With ThisWorkbook.Sheets("Sheet 1")
.AutoFilterMode = False
lastRow = .Range("A" & .Rows.Count).End(xlUp).row
With .Range("A1:N" & lastRow)
.AutoFilter Field:=2, Criteria1:="313"
.AutoFilter Field:=3, Criteria1:="1", Operator:=xlOr, Criteria2:="2"
If Application.WorksheetFunction.Subtotal(103, .Cells.Resize(, 1)) > 1 Then 'count visible cells in column "A" other than the header
.Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Copy .Cells(lastRow + 1, 1)
End If
End With
.AutoFilterMode = False
End With
End Sub