有条件的Excel VB高级筛选器副本

时间:2018-10-01 15:18:28

标签: excel vba excel-vba

我试图在复制的每一行上加一个条件。我想要所有唯一性,但前提是它们在另一个字段中也具有特定值。

这是我必须获取所有唯一性的方法(它可以工作),但是我不知道如何只获取J列中具有特定值的行。

r1.Columns(20).AdvancedFilter xlFilterCopy, , Sheet11.Range("A1"), unique:=True

我尝试做一个CriteriaRange,但是似乎语法不正确。另外,我考虑过一个If语句,但从逻辑上讲,这意味着它会在每次有真实语句时(而不是按行)触发整个列表。

这是我认为可能会起作用的方式。但是我收到类型不匹配错误。

r1.Columns(20).AdvancedFilter xlFilterCopy, r1.Columns(10).Value = "November", Sheet11.Range("A1"), unique:=True

有想法吗?

2 个答案:

答案 0 :(得分:1)

首先,您的条件范围应为-Range,其标题对应于要过滤的列,且条件在下面。例如,此快照中的D1:D2

enter image description here

第二,在同一步骤中过滤另一列(20)时,您将无法仅复制单个列(10)。

您可以将高级过滤器调整为

  • 首先根据提供的条件将整个列表过滤到位
  • 然后复制相关列中的可见单元格

这样的事情(根据需要更改SheetRange引用):

Sub MyFilter()
    Dim lastRow As Long

    With Sheet1
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row

        .Range("A1:B" & lastRow).AdvancedFilter _
            Action:=xlFilterInPlace, CriteriaRange:=.Range("D1:D2"), Unique:=True

        With .Range("B1:B" & lastRow).SpecialCells(xlCellTypeVisible)
            .Copy Sheet2.Range("A1")
        End With

        .ShowAllData
    End With
End Sub

答案 1 :(得分:0)

为了能够保持代码的其他部分正常工作。我添加了一个隐藏工作表,并编写了一个宏以将过滤后的结果复制到新的隐藏工作表中。然后,我将原始代码与该隐藏工作表上的过滤数据相对应。

Sub FilterLiveToDataSheet()
' Unhide Required Sheets
    Sheets("Original-Data").Visible = True
    Sheets("Filtered-Data").Visible = True

' Delete Old Data
    Sheets("Filtered-Data").Select
    Cells.Select
    Selection.ClearContents

' Copy Filtered Data
    Sheets("Original-Data").Select
    Range("TBL_ATTR_Spend[[#Headers],[HeaderName]]").Select
    Selection.AutoFilter
    ActiveSheet.ListObjects("TBL_ATTR_Spend").Range.AutoFilter Field:=10, _
        Criteria1:="Delta"
    Cells.Select
    Selection.Copy

' Paste to Data Sheet
    Sheets("Filtered-Data").Select
    Cells.Select
    ActiveSheet.Paste

' Unfilter Original Data Page
    Sheets("Original-Data").Select
    Range("TBL_ATTR_Spend[[#Headers],[HeaderName]]").Select
    Selection.AutoFilter

' Hide Required Sheets
    Sheets("Original-Data").Visible = False
    Sheets("Filtered-Data").Visible = False

' Go to Results Sheet
    Sheets("Results").Select