基于多个过滤器创建工作表

时间:2020-02-17 19:33:02

标签: excel vba

我发现并正在使用以下代码,并且可以很好地实现预期的目的,但是出于我的目的,我需要能够提供不止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的独特组合而使用的测试数据和预期的标签

Test Data and Expected Results

1 个答案:

答案 0 :(得分:0)

您可以使用另一个字典,例如objDict并使用B列中的值,然后遍历两个字典以创建过滤器。工作表名称可以是两个字典的值的串联,例如“ Daniel-0078”或“ Daniel-0079”,因此您可以根据需要进行比较和删除。您还可以使用这种推理方法来制作所需的十二个选项卡(使用四个不同的字典),但还要考虑到工作表名称的最大长度为30。

相关问题