如下图所示,需要把工资条按照姓名列拆分工作表为独立的工作薄:

拆分效果如下所示:

Sub 拆分工资条() ' 保留标题拆分工作表为若干新工作簿
Dim arr, dict As Object, k, t, i&, lc%, rng As Range, c% ' 定义变量
c = Application.InputBox("请输入拆分列号:", , 1) ' 弹出输入框,要求用户输入拆分列号,默认为第1列
If c = 0 Then Exit Sub ' 如果用户未输入或输入为0,则退出子程序
Application.ScreenUpdating = False ' 关闭屏幕更新,提高代码执行速度
Application.DisplayAlerts = False ' 关闭Excel的警告提示
arr = [a1].CurrentRegion ' 获取当前连续数据区域,赋值给arr
lc = UBound(arr, 2) ' 获取arr的列数,赋值给lc
Set rng = [a1].Resize(, lc) ' 设置rng为从A1开始,列数为lc的区域
Set dict = CreateObject("scripting.dictionary") ' 创建一个字典对象dict
' 遍历数据区域,将数据按照拆分列的值分类存储到字典中
For i = 2 To UBound(arr)
If Not dict.Exists(arr(i, c)) Then ' 如果字典中不存在该分类
Set dict(arr(i, c)) = Cells(i, 1).Resize(1, lc) ' 将当前行数据添加到字典中,键为拆分列的值
Else
Set dict(arr(i, c)) = Union(dict(arr(i, c)), Cells(i, 1).Resize(1, lc)) ' 如果字典中存在该分类,则将当前行数据添加到该分类中
End If
Next
' 获取字典的键和值,准备遍历字典,为每个分类创建一个新的工作簿
k = dict.Keys
t = dict.Items
' 遍历字典
For i = 0 To dict.Count - 1
With Workbooks.Add(xlWBATWorksheet) ' 创建一个新的工作簿
rng.Copy .Sheets(1).[a1] ' 将原数据区域的表头复制到新工作簿的A1位置
t(i).Copy .Sheets(1).[a2] ' 将当前分类的数据复制到新工作簿的A2开始的位置
.SaveAs Filename:=ThisWorkbook.Path & "\" & k(i) & ".xlsx" ' 保存新工作簿,文件名为分类的值加上.xlsx后缀
.Close ' 关闭新工作簿
End With
Next
Application.DisplayAlerts = True ' 恢复Excel的警告提示
Application.ScreenUpdating = True ' 恢复屏幕更新
MsgBox "完毕" ' 显示一个消息框,告知用户操作完成
End Sub