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 到基于多列的自动过滤器的主要内容,如果未能解决你的问题,请参考以下文章