Vba 到基于多列的自动过滤器

Posted

技术标签:

【中文标题】Vba 到基于多列的自动过滤器【英文标题】:Vba to Auto filter based on multiple columns 【发布时间】:2021-02-12 14:01:25 【问题描述】:

我正在做一个项目,我需要你的帮助

我需要 Vba 代码来根据多列自动过滤和计数项目

例如 我有

所以结果应该是

所有范围以此类推

我尝试了自动过滤,然后为过滤后的数据选择案例代码 并且工作但只是为了另一种观点而不是我正在寻找的观点 选择案例的结果如下

感谢您的支持,请以这种模式获取过滤后的数据

【问题讨论】:

请将您的问题edit 创建为minimal reproducible example。 看来问题只有你懂了…… 这看起来更像是一个数据透视表,而不是我描述为过滤器的任何东西...... 请对此代码提供任何帮助 在您预期的结果的最后一行,您的意思是项目状态可用,已使用标志,但计数为零?你是怎么得到四个DG8045标志使用的,所有供应商都是华为,而在你的数据中,有一个使用华为供应商的DG8045,三个使用TP-link供应商的DG8045? 【参考方案1】:

由于您的预期结果令人困惑(如果与图片中的数据进行比较),我不太确定您预期的结果是什么。

无论如何,下面是一个惰性代码,它根据看起来像您图片中的数据创建一个数据透视表。之后,就是一个复制粘贴的过程。

假设您的数据在 sheet1 中, 从单元格 A1 开始,有六个列标题(单元格 A1 到 F1),F 列之后的左边什么都没有。

Sub test()
Set sh = Sheets("Sheet1")
Set shResult = Sheets("Sheet2")
sh.Range("G:Z").Delete

With sh
Range("C1").Value = "BLANK"
Set rg = .Range("A1", .Range("A" & Rows.Count).End(xlUp))
rg.Offset(0, 6).Value = 1
rg.Resize(rg.Rows.Count, 7).Name = "data"
End With

    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "data", Version:=xlPivotTableVersion14).CreatePivotTable _
        TableDestination:=sh.Range("P1"), TableName:="ptTmp", DefaultVersion _
        :=xlPivotTableVersion14
        
    With sh.PivotTables("ptTmp").PivotFields("SKU Name")
        .Orientation = xlRowField
        .Position = 1
        .Subtotals = Array _
        (False, False, False, False, False, False, False, False, False, False, False, False)
    End With
    
    With sh.PivotTables("ptTmp").PivotFields("Supplier")
        .Orientation = xlRowField
        .Position = 2
        .Subtotals = Array _
        (False, False, False, False, False, False, False, False, False, False, False, False)
    End With
    
    With sh.PivotTables("ptTmp").PivotFields("Inventory Item Status")
        .Orientation = xlRowField
        .Position = 3
        .Subtotals = Array _
        (False, False, False, False, False, False, False, False, False, False, False, False)
    End With
    
    With sh.PivotTables("ptTmp").PivotFields("Flag")
        .Orientation = xlRowField
        .Position = 4
        .Subtotals = Array _
        (False, False, False, False, False, False, False, False, False, False, False, False)
    End With
    
    With sh.PivotTables("ptTmp").PivotFields("FLAG")
        .PivotItems("Used").Visible = False
        .PivotItems("Bad").Visible = False
    End With
    
    With sh.PivotTables("ptTmp")
    .AddDataField ActiveSheet.PivotTables("ptTmp"). _
        PivotFields("1"), "COUNT", xlCount
    .RowAxisLayout xlTabularRow
    .RepeatAllLabels xlRepeatLabels
    .ColumnGrand = False
    .ShowTableStyleRowHeaders = False
    .TableRange1.Copy
    End With

    shResult.Range("A1").PasteSpecial Paste:=xlPasteValues
    shResult.Range("A1").PasteSpecial Paste:=xlPasteFormats
    
        With sh.PivotTables("ptTmp")
            With .PivotFields("FLAG")
            .ClearAllFilters
            .PivotItems("New").Visible = False
            .PivotItems("Bad").Visible = False
            End With
            With .PivotFields("SKU Name")
            Range(.DataRange, .DataRange.Offset(0, 4)).Copy
            End With
        End With
    
    shResult.Range("A" & Rows.Count).End(xlUp).Offset(2, 0).PasteSpecial Paste:=xlPasteValues
    
        With sh.PivotTables("ptTmp")
            With .PivotFields("FLAG")
            .ClearAllFilters
            .PivotItems("New").Visible = False
            .PivotItems("Used").Visible = False
            End With
            With .PivotFields("SKU Name")
            Range(.DataRange, .DataRange.Offset(0, 4)).Copy
            End With
        End With

    shResult.Range("A" & Rows.Count).End(xlUp).Offset(2, 0).PasteSpecial Paste:=xlPasteValues
    
    sh.Range("G:Z").Delete
    shResult.Activate
    shResult.Range("A1").Select
End Sub

【讨论】:

亲爱的 Karma,非常感谢您的帮助,因为这正是我所需要的,真的很感谢您的支持,但我还有 2 个问题请 1.如何将结果复制到另一张相同的工作簿 2. 如果我需要为 ex 添加额外的标志类型:bad 我尝试添加 With sh.PivotTables("ptTmp").PivotFields("FLAG") .PivotItems("Bad").Visible = False End With but我得到的观点就像ibb.co/TgN5WQ0,我需要它是这样的ibb.co/0KyXXnH @MostafaNabil,请查看代码。我已经修改,所以结果将放在 Sheet2 中。 (请确保您的工作簿有标签 Sheet2)。 再次感谢您!没有言语可以形容我多么感激和感谢您的支持,是的,它起作用了我面临的唯一问题是,当我在同一工作簿的另一张纸上创建按钮来调用此功能时,它在打开和激活之前不起作用源表本身! @MostafaNabil,很高兴我能提供帮助。很抱歉,我在代码中犯了一行错误。请将AddDataField ActiveSheet.PivotTables("ptTmp") 行更改为AddDataField sh.PivotTables("ptTmp")。现在您可以使用按钮来调用 Sheet2 上的宏。不要忘记将代码放在常规模块中,而不是表单模块中。

以上是关于Vba 到基于多列的自动过滤器的主要内容,如果未能解决你的问题,请参考以下文章

VBA自动过滤复制值,去重并粘贴到其他工作表中

复制自动过滤范围,vba excel

VBA - 自动过滤器 - 总是隐藏确切的值

从跨越多列的名称范围编译不同值的列表

VBA自动过滤器不等于

在具有德国区域设置的计算机上使用 VBA 自动过滤器过滤日期问题