我发现并正在使用以下代码,并且可以很好地实现预期的目的,但是出于我的目的,我需要能够提供不止1个过滤器,然后才能创建工作表。
'https://access-excel.tips/excel-vba-filter-value-then-copy-data-to-new-worksheet/
Public Sub FilterThenCopy()
Dim ws, newWS, currentWS As Worksheet
targetCol = 1 'define which column you want to break
Dim objDict As Variant
Set objDict = CreateObject("Scripting.Dictionary")
Set currentWS = ActiveSheet
'Add unique value in targetCol to the dictionary
Application.DisplayAlerts = False
For r = 2 To Cells(Rows.Count, targetCol).End(xlUp).Row
If Not objDict.exists(Cells(r, targetCol).Value) Then
objDict.Add Cells(r, targetCol).Value, Cells(r, targetCol).Value
End If
Next r
If currentWS.AutoFilterMode = True Then
currentWS.UsedRange.AutoFilter
End If
currentWS.UsedRange.AutoFilter
For Each k In objDict.Keys
currentWS.UsedRange.AutoFilter Field:=1, Criteria1:=objDict.Item(k)
'delete worksheet if worksheet of item(k) exist
For Each ws In ActiveWorkbook.Worksheets
If wsExists(objDict.Item(k)) Then
Sheets(objDict.Item(k)).Delete
End If
Next ws
'crate worksheet using item(k) name
Set newWS = ThisWorkbook.Worksheets.Add(After:=Worksheets(Worksheets.Count))
newWS.Name = objDict.Item(k)
'copy filtered contents to new worksheet
currentWS.Cells.Copy
newWS.Range("A1").Select
Sheets(objDict.Item(k)).Paste
Next k
currentWS.Activate
currentWS.AutoFilterMode = False
Application.DisplayAlerts = True
End Sub
Function wsExists(wksName As String) As Boolean
On Error Resume Next
wsExists = CBool(Len(Worksheets(wksName).Name) > 0)
On Error GoTo 0
End Function
如果我录制了一个宏来设置多个过滤器,这就是录制的内容
ActiveSheet.Range("$A$1:$C$13").AutoFilter Field:=1, Criteria1:="Daniel"
ActiveSheet.Range("$A$1:$C$13").AutoFilter Field:=3, Criteria1:="0078"
ActiveSheet.Range("$A$1:$C$13").AutoFilter Field:=5, Criteria1:="661"
ActiveSheet.Range("$A$1:$C$13").AutoFilter Field:=6, Criteria1:="0007"
我正在尝试弄清楚我该如何进行这项工作。前三个条件必须保持动态,并为每个唯一值组合生成一张表。但是3既需要动态化(必须达到95%的肯定性),也可以在执行时提供。由于它们的工作方式,可能需要提供一种方法,使用户可以根据自己选择的字段来选择要如何创建图纸,如果没有,则默认情况下将基于3个条件来创建。 / p>
有人问这个问题,我能指出我正确的方向吗。
以下是基于Dept,Class和Sub的独特组合而使用的测试数据和预期的标签
答案 0 :(得分:0)
您可以使用另一个字典,例如objDict
并使用B列中的值,然后遍历两个字典以创建过滤器。工作表名称可以是两个字典的值的串联,例如“ Daniel-0078”或“ Daniel-0079”,因此您可以根据需要进行比较和删除。您还可以使用这种推理方法来制作所需的十二个选项卡(使用四个不同的字典),但还要考虑到工作表名称的最大长度为30。