Sub 保留表头拆分数据为若干新工作簿()
' 弹出输入框让用户输入拆分列号
c = Application.InputBox("请输入拆分列号", , 4, , , , , 1)
If c = 0 Then Exit Sub
' 禁用屏幕更新和警告
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' 获取当前区域数组
arr = [a1].CurrentRegion
lc = UBound(arr, 2)
' 设置拆分列的标题行
Set rng = [a1].Resize(1, lc)
' 创建字典对象
Set d = CreateObject("scripting.dictionary")
' 从第三行开始遍历数组
For i = 3 To UBound(arr)
If Not d.Exists(arr(i, c)) Then
' 如果字典中不存在该键,则添加键和对应的行
Set d(arr(i, c)) = Cells(i, 1).Resize(1, lc)
Else
' 如果字典中已存在该键,则将当前行添加到对应的键下
Set d(arr(i, c)) = Union(d(arr(i, c)), Cells(i, 1).Resize(1, lc))
End If
Next
' 获取字典的键和项
k = d.Keys
t = d.Items
' 遍历字典,为每个键创建一个新的工作簿
For i = 0 To d.Count - 1
With Workbooks.Add(xlWBATWorksheet)
' 复制标题行
rng.Copy .Sheets(1).[a1]
' 复制对应键的数据行
t(i).Copy .Sheets(1).[a3] ' 从第三行开始复制
' 保存新工作簿
.SaveAs Filename:=ThisWorkbook.Path & "\" & k(i) & ".xls"
.Close
End With
Next
' 启用屏幕更新和警告
Application.DisplayAlerts = True
Application.ScreenUpdating = True
' 显示完成消息
MsgBox "拆分完毕"
End Sub