自动过滤器 - 过滤数据并复制到特定行,然后更改过滤器并复制到第一组下方的行
Autofilter - Filtering data and copying into a specific row, then changing a filter and copying into a row below the first set
我正在创建一个 Excel 工作簿,它将使用 VBA 将两个过滤器应用于 sheet 请求的项目。 Q 列包含 'Hardware' 或 'Smartphone',R 列包含 'Yes' 或 'No'。其他字段的内容无关紧要。过滤器将应用于 'Hardware' 的 Q 列和 'No' 的 R 列。对于满足这两个条件的每个项目,它们将被粘贴到另一个选项卡上的特定行 A11,该选项卡包含 A10 中的 header 行。在已粘贴的行下方,我想要两个空白行,然后是一行文本 "Your Text Here",然后将重复 header 行。最后,R 列过滤器将切换为 'Yes',而 Q 列过滤器保持 'Hardware'。此过滤器生成的行将复制到第二个 header 行下方。
“硬件”选项卡将包含以下内容,
- A1-A9 - 空白,内容稍后补充。
- A10 - Header 行数据,
- A11-A(X) - 列 Q = "Hardware" 和列 R = "No"、
的数据行
- A(X+1)-A(X+2) - 空白行,
- A(X+3) - "Your Text Here",
- A(X+4) - Header 数据行,
- A(X+5) - 列 Q = "Hardware" 和列 R = "Yes".
的数据行
我改编了我在这个网站上找到的 VBA 脚本,非常感谢 Siddharth Rout。
How to copy a line in excel using a specific word and pasting to another excel sheet?
当我 运行 宏时,它会正确应用两个过滤器并将正确的行复制到 'Hardware' 选项卡中。但是我希望将其粘贴到 header 行下方的单元格 A11 中,但数据实际上正在覆盖它并复制到单元格 A10 中。
因为我无法停止覆盖我的 header 行或将第一组放在正确的位置,所以我不确定如何在其下方添加我需要的内容以及如何确定位置第二盘会去。
我曾尝试更改 'After:=.Range("A11"), _' 中的值,但我很可能误解了它的作用。我希望它始终从 A11 行开始,并且不触及第 10 行及以上的任何内容,即使它们是空白的。
Dim wb1 As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim copyFrom As Range
Dim lRow As Long
Set wb1 = ThisWorkbook
Set ws1 = wb1.Worksheets("Raw")
With ws1
.AutoFilterMode = False
lRow = .Range("Q" & .Rows.Count).End(xlUp).Row
With .Range("Q1:R" & lRow)
.AutoFilter Field:=1, Criteria1:="Hardware" '-> Hardware Items
.AutoFilter Field:=2, Criteria1:="No" '-> Not Business Continuity
Set copyFrom = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
End With
.AutoFilterMode = False
End With
'-> Destination
Set ws2 = wb1.Worksheets("Hardware")
With ws2
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lRow = .Cells.Find(What:="*", _
After:=.Range("A11"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lRow = 1
End If
copyFrom.Copy .Rows(lRow)
End With
wb1.Save
End Sub
非常感谢任何可能回复的人,如果我的总结可以做得更好,我们深表歉意。
如果知道要粘贴A11的范围,可以直接粘贴。
而不是使用 find for lrow ,在 With ws2 中做
With ws2
copyFrom.Copy .Range("A11")
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
这会将范围粘贴到 A11 行,然后您可以获得下一个最后一行。通过(将其定义为 Dim lrow as Long)获取 X。
现在您有了包含数据 (X) 的最后一行。正如您所说,下一个数据行是 X + 5 。首先通过
清除初始过滤器
ActiveSheet.AutoFilter.ShowAllData
因此调整代码以使用条件 "Yes" 执行其他过滤器,然后按
粘贴
With ws2
copyFrom.Copy .Range("A" & lrow + 5)
我正在创建一个 Excel 工作簿,它将使用 VBA 将两个过滤器应用于 sheet 请求的项目。 Q 列包含 'Hardware' 或 'Smartphone',R 列包含 'Yes' 或 'No'。其他字段的内容无关紧要。过滤器将应用于 'Hardware' 的 Q 列和 'No' 的 R 列。对于满足这两个条件的每个项目,它们将被粘贴到另一个选项卡上的特定行 A11,该选项卡包含 A10 中的 header 行。在已粘贴的行下方,我想要两个空白行,然后是一行文本 "Your Text Here",然后将重复 header 行。最后,R 列过滤器将切换为 'Yes',而 Q 列过滤器保持 'Hardware'。此过滤器生成的行将复制到第二个 header 行下方。
“硬件”选项卡将包含以下内容,
- A1-A9 - 空白,内容稍后补充。
- A10 - Header 行数据,
- A11-A(X) - 列 Q = "Hardware" 和列 R = "No"、 的数据行
- A(X+1)-A(X+2) - 空白行,
- A(X+3) - "Your Text Here",
- A(X+4) - Header 数据行,
- A(X+5) - 列 Q = "Hardware" 和列 R = "Yes". 的数据行
我改编了我在这个网站上找到的 VBA 脚本,非常感谢 Siddharth Rout。 How to copy a line in excel using a specific word and pasting to another excel sheet?
当我 运行 宏时,它会正确应用两个过滤器并将正确的行复制到 'Hardware' 选项卡中。但是我希望将其粘贴到 header 行下方的单元格 A11 中,但数据实际上正在覆盖它并复制到单元格 A10 中。
因为我无法停止覆盖我的 header 行或将第一组放在正确的位置,所以我不确定如何在其下方添加我需要的内容以及如何确定位置第二盘会去。
我曾尝试更改 'After:=.Range("A11"), _' 中的值,但我很可能误解了它的作用。我希望它始终从 A11 行开始,并且不触及第 10 行及以上的任何内容,即使它们是空白的。
Dim wb1 As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim copyFrom As Range
Dim lRow As Long
Set wb1 = ThisWorkbook
Set ws1 = wb1.Worksheets("Raw")
With ws1
.AutoFilterMode = False
lRow = .Range("Q" & .Rows.Count).End(xlUp).Row
With .Range("Q1:R" & lRow)
.AutoFilter Field:=1, Criteria1:="Hardware" '-> Hardware Items
.AutoFilter Field:=2, Criteria1:="No" '-> Not Business Continuity
Set copyFrom = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
End With
.AutoFilterMode = False
End With
'-> Destination
Set ws2 = wb1.Worksheets("Hardware")
With ws2
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lRow = .Cells.Find(What:="*", _
After:=.Range("A11"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lRow = 1
End If
copyFrom.Copy .Rows(lRow)
End With
wb1.Save
End Sub
非常感谢任何可能回复的人,如果我的总结可以做得更好,我们深表歉意。
如果知道要粘贴A11的范围,可以直接粘贴。 而不是使用 find for lrow ,在 With ws2 中做
With ws2
copyFrom.Copy .Range("A11")
lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
这会将范围粘贴到 A11 行,然后您可以获得下一个最后一行。通过(将其定义为 Dim lrow as Long)获取 X。
现在您有了包含数据 (X) 的最后一行。正如您所说,下一个数据行是 X + 5 。首先通过
清除初始过滤器ActiveSheet.AutoFilter.ShowAllData
因此调整代码以使用条件 "Yes" 执行其他过滤器,然后按
粘贴 With ws2
copyFrom.Copy .Range("A" & lrow + 5)