自动过滤器-过滤数据并复制到特定行,然后更改过滤器并复制到第一组下面的行中

问题描述 投票:0回答:1

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

然后,“硬件”选项卡将包含以下内容,

  • A1-A9-空白,稍后将添加内容。
  • A10-数据的标题行,
  • [A11-A(X)-列Q =“ Hardware”和列R =“ No”的数据行,
  • A(X + 1)-A(X + 2)-空白行,
  • A(X + 3)-“此处输入您的文字”,
  • A(X + 4)-数据的标题行,
  • 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?

当我运行宏时,它将正确应用两个过滤器,并将正确的行复制到“硬件”标签中。但是我希望将其粘贴到标题行下方的单元格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个回答
0
投票
With ws2 copyFrom.Copy .Range("A11") lRow = .Cells(.Rows.Count, 1).End(xlUp).Row

这会将范围粘贴到A11行中,然后您可以得到下一个最后一行。得到X by(将它定义为Dim lrow as Long)。

现在您有了包含数据(X)的最后一行。如您所述,下一个数据行是X + 5。首先通过[清除初始过滤器

ActiveSheet.AutoFilter.ShowAllData

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

 With ws2
         copyFrom.Copy .Range("A" & lrow + 5)
© www.soinside.com 2019 - 2024. All rights reserved.