|
楼主 |
发表于 2013-11-3 17:33
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 佛山小老鼠 于 2013-11-3 17:35 编辑
第4个案例
按列拆分成工作表
按列拆分成独立的工作簿
- Option Explicit
- Sub 按列拆分成工作表()
- Dim x%, Rg As Range, ColNum&, dic, arr1, y&, arr2, z&
- Set dic = CreateObject("scripting.dictionary")
- Sheets("总表").Activate
- For x = Sheets.Count To 2 Step -1 '删除工作表时要从大到小循环
- Application.DisplayAlerts = False '关闭询问对话框
- Sheets(x).Delete '删除工作表
- Application.DisplayAlerts = True '打开询问对话框
- Next x
- '通过InputBox这个方法确定你要拆分的列
- On Error GoTo 100 '如果有错误跳转到100外
- Set Rg = Application.InputBox("请选择您要拆分的列", "选择", Type:=8) '用了这句不可以关闭屏幕刷新
- ColNum = Rg.Column '把要拆分的列赋值变量 ColNum
- On Error GoTo 0 '下面的代码有错误,继续报错
- arr1 = Range("a1").CurrentRegion
- For y = 2 To UBound(arr1)
- If dic(arr1(y, ColNum)) = "" Then
- End If
- Next y
- arr2 = dic.keys '把字典里的关键词一次性赋值给数组arr2,且是一维数组,编号从0开始
- For z = 0 To dic.Count - 1 '循环字典的关键词
- Sheets.Add after:=Sheets(Sheets.Count)
- Sheets(Sheets.Count).Name = arr2(z)
- Sheets("总表").Activate '由于新建后活动表会转到最后一个工作表,要重新选择“总表”为活动工作表进行筛选
- Range(Cells(1, 1), Cells(UBound(arr1, 1), UBound(arr1, 2))).AutoFilter ColNum, arr2(z)
- '方法AutoFilter第一参数筛选哪一列,第二参数筛选关键词
- Range(Cells(1, 1), Cells(UBound(arr1, 1), UBound(arr1, 2))).SpecialCells(xlCellTypeVisible).Copy Sheets(Sheets.Count).Range("A1") '定位可见单元格
- '如果那一列是数据化,大家一定要注意,不能用sheets(arr2(z)表示工作表,要用sheets(sheets.count)表示
- '这样程序就通用
- Next z
- Range(Cells(1, 1), Cells(UBound(arr1, 1), UBound(arr1, 2))).AutoFilter
- Exit Sub
- 100:
- MsgBox "您选择了取消或者是关闭,即将退出程序", 64, "温馨提示"
- End Sub
复制代码- Option Explicit
- Sub 按列拆分成独立的工作簿()
- Dim x%, Rg As Range, ColNum&, dic, arr1, y&, arr2, z&, St, StFile$, a%, b%, wb As Workbook
- Set dic = CreateObject("scripting.dictionary")
- St = Application.FileDialog(msoFileDialogFolderPicker).Show '如果你选择了文件夹就返回-1,不选择文件夹
- '就返回0,相当于你按了取消和关闭按钮
- If St <> 0 Then
- StFile = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)
- '取得你选择的那个文件夹路径
- Else
- Exit Sub
- End If
- Sheets("总表").Activate
- For x = Sheets.Count To 2 Step -1 '删除工作表时要从大到小循环
- Application.DisplayAlerts = False '关闭询问对话框
- Sheets(x).Delete '删除工作表
- Application.DisplayAlerts = True '打开询问对话框
- Next x
- '通过InputBox这个方法确定你要拆分的列
- On Error GoTo 100 '如果有错误跳转到100外
- Set Rg = Application.InputBox("请选择您要拆分的列", "选择", Type:=8) '用了这句不可以关闭屏幕刷新
- ColNum = Rg.Column '把要拆分的列赋值变量 ColNum
- On Error GoTo 0 '下面的代码有错误,继续报错
- arr1 = Range("a1").CurrentRegion
- For y = 2 To UBound(arr1)
- If dic(arr1(y, ColNum)) = "" Then
- End If
- Next y
- arr2 = dic.keys '把字典里的关键词一次性赋值给数组arr2,且是一维数组,编号从0开始
- For z = 0 To dic.Count - 1 '循环字典的关键词
- Sheets.Add after:=Sheets(Sheets.Count)
- Sheets(Sheets.Count).Name = arr2(z)
- Sheets("总表").Activate '由于新建后活动表会转到最后一个工作表,要重新选择“总表”为活动工作表进行筛选
- Range(Cells(1, 1), Cells(UBound(arr1, 1), UBound(arr1, 2))).AutoFilter ColNum, arr2(z)
- '方法AutoFilter第一参数筛选哪一列,第二参数筛选关键词
- Range(Cells(1, 1), Cells(UBound(arr1, 1), UBound(arr1, 2))).SpecialCells(xlCellTypeVisible).Copy Sheets(Sheets.Count).Range("A1") '定位可见单元格
- '如果那一列是数据化,大家一定要注意,不能用sheets(arr2(z)表示工作表,要用sheets(sheets.count)表示
- '这样程序就通用
- Next z
- Range(Cells(1, 1), Cells(UBound(arr1, 1), UBound(arr1, 2))).AutoFilter '取消筛选
- Application.DisplayAlerts = False '关闭询问对话框
- For a = 2 To Sheets.Count '循环总表后面的分表
- Sheets(a).Copy '依次复制分表成独立的工作簿
- Set wb = ActiveWorkbook '把分表折成的独立的工作簿设置为活动工作簿
- With wb
- .SaveAs Filename:=StFile & "" & Sheets(1).Name & ".xls", FileFormat:=xlExcel8 '把新的工作簿保存为规定的文件夹下
- .Close True '关闭工作簿,且保存
- End With
- Next a
- For b = Sheets.Count To 2 Step -1 '删除"总表"工作表后面所有工作表
- Sheets(b).Delete
- Next b
- Application.DisplayAlerts = True '打开询问对话框
- MsgBox "亲,拆分完毕,请查阅", 64, "温馨提示"
- Shell "explorer.exe " & StFile, 1 '显示拆分后的,便于查询,大家要注意思exe后面有一个空格
- Exit Sub
- 100:
- MsgBox "您选择了取消或者是关闭,即将退出程序", 64, "温馨提示"
- End Sub
复制代码
附件在第1楼
|
|