您可以学习和调整以下内容。这是正在发生的事情的概述。
- 我有一个从单元格 A5 开始的人员表,在 G 列中有一个办公室列表;
- 我正在从 G5 向下复制(假设此列的数据中没有空白)到 W1;
- 从 W1 范围向下,我正在删除重复项;
- 然后我遍历这些数据,使用高级过滤器将每个办公室的数据复制到从单元格 Z1 开始的区域;
- 然后将过滤后的数据移动(剪切)到一个新的工作表中,该工作表以当前的办公室名称(标准)命名;
- 在每个高级过滤器之后,单元格 W2 被删除,使 W3 中的值向上移动,以便它可以用于下一个过滤器操作。
这确实意味着当您按 Ctrl-End 转到最后使用的单元格时,它会走得比它需要的更远。如有必要,您可以找到解决此问题的方法;)。
Sub SheetsFromFilter()
Dim wsCurrent As Worksheet
Dim wsNew As Worksheet
Dim iLeft As Integer
Set wsCurrent = ActiveSheet
Application.ScreenUpdating = False
Range("G5", Range("G5").End(xlDown)).Copy Range("W1")
Range("W1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
iLeft = Range("W1").CurrentRegion.Rows.Count - 1
Do While iLeft > 0
wsCurrent.Range("A5").CurrentRegion.AdvancedFilter xlFilterCopy, _
wsCurrent.Range("W1:W2"), wsCurrent.Range("Z1")
Set wsNew = Worksheets.Add
wsCurrent.Range("Z1").CurrentRegion.Cut wsNew.Range("A1")
wsNew.Name = wsCurrent.Range("W2").Value
wsCurrent.Range("W2").Delete xlShiftUp
iLeft = iLeft - 1
Loop
wsCurrent.Range("W1").Clear
Application.ScreenUpdating = True
End Sub
顺便说一句,我不打算为您的特定文件修改它;这是您应该做的事情(或付钱给某人做;))。
顺便说一句,可以使用普通(而不是高级)过滤器来完成。您仍然会复制该列并删除重复项。这样做的好处是不会过多地增加工作表的表观大小。但我决定这样做;)。
补充:嗯,我也受到了启发,用 AutoFilter 实现了这一点:
Sub SheetsFromAutoFilter()
Dim wsCurrent As Worksheet
Dim wsNew As Worksheet
Dim iLeft As Integer
Set wsCurrent = ActiveSheet
Application.ScreenUpdating = False
Range("G5", Range("G5").End(xlDown)).Copy Range("W1")
Range("W1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
iLeft = Range("W1").CurrentRegion.Rows.Count - 1
Do While iLeft > 0
Set wsNew = Worksheets.Add
With wsCurrent.Range("A5").CurrentRegion
.AutoFilter field:=7, _
Criteria1:=wsCurrent.Range("W1").Offset(iLeft).Value
.Copy wsNew.Range("A1")
.AutoFilter
End With
wsNew.Name = wsCurrent.Range("W1").Offset(iLeft).Value
iLeft = iLeft - 1
Loop
wsCurrent.Range("W1").CurrentRegion.Clear
Application.ScreenUpdating = True
End Sub
[这两个过程都可以使用定义的名称和一些错误处理/检查来改进。]