【问题标题】:Autofilter - Filtering data and copying into a specific row, then changing a filter and copying into a row below the first set自动过滤器 - 过滤数据并复制到特定行,然后更改过滤器并复制到第一组下方的行中
【发布时间】:2020-08-11 17:39:24
【问题描述】:

我正在创建一个 Excel 工作簿,该工作簿将使用 VBA 将两个过滤器应用于一张请求的项目。 Q 列包含“硬件”或“智能手机”,R 列包含“是”或“否”。其他字段的内容无关紧要。过滤器将应用于“硬件”列 Q 和“否”列 R。对于满足这两个条件的每个项目,它们将被粘贴到另一个选项卡上的特定行 A11 中,该选项卡包含 A10 中的标题行。在已粘贴的行下方,我想要两个空白行,然后是一行文本“Your Text Here”,并且将重复标题行。最后,R 列过滤器将切换为“是”,而 Q 列过滤器保持在“硬件”上。此过滤器生成的行将被复制到第二个标题行的下方。

硬件选项卡将包含以下内容,

  • A1-A9 - 空白,内容稍后添加。
  • A10 - 数据的标题行,
  • A11-A(X) - 列 Q =“硬件”且列 R =“否”的数据行,
  • A(X+1)-A(X+2) - 空白行,
  • A(X+3) - “你的文字在这里”,
  • A(X+4) - 数据的标题行,
  • A(X+5) - 列 Q =“硬件”且列 R =“是”的数据行。

我已经改编了我在这个网站上找到的 VBA 脚本,非常感谢 Siddharth Rout。 How to copy a line in excel using a specific word and pasting to another excel sheet?

当我运行宏时,它会正确应用两个过滤器并将正确的行复制到“硬件”选项卡中。但是我希望将它粘贴到标题行下方的单元格 A11 中,但数据实际上是覆盖它并复制到单元格 A10 中。

因为我无法停止覆盖我的标题行或将第一组放在正确的位置,所以我不确定如何在其下方添加我需要的内容以及如何确定第二组的位置。

我尝试更改 '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

非常感谢任何可能回复并道歉的人,如果我的总结可以更好的话。

【问题讨论】:

    标签: excel vba autofilter


    【解决方案1】:

    如果你知道必须在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
    

    因此调整代码以使用条件“是”进行其他过滤,然后将其粘贴

     With ws2
             copyFrom.Copy .Range("A" & lrow + 5)
    

    【讨论】:

    • 啊!太棒了,谢谢!我现在将第一个数据集复制到正确的位置,第二个数据集添加到最后一行下方 5 行,脚本中的一些额外行用于将标题行和一些文本添加到其中一个单元格中。
    • 很高兴听到!祝你的项目好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多