最近经常要是把多个工作表拆分成单个的工作簿,一个存货底稿十几二十个工作簿,拆到想吐血。
吐槽了几句后,跟同事吹牛,说我能编个小程序,一键拆分。
学过一点点VBA,冥冥之中,感觉能把代码写出来。思路挺简单的,复制工作表,再另存为指定的文件夹,两部就完事儿了。但是VBA不经常用,得参考着别人的代码才能写出来。
回去之后,打开之前那个学习网站,找到相关的教学视频,把课程上的代码修改了一下,尝试了一下,bug很多。
代码是这样子的:
Sub 拆分到工作簿()
Dim wk As Workbook, ss$, k%
Application.DisplayAlerts = False
For Each sht In Workbooks("VBA拆分工作簿0.xlsm").Sheets
Set wk = Workbooks.Add
k = k 1
Workbooks(1).Sheets(k).Copy Workbooks(2).Sheets(1)
ss = ThisWorkbook.Path & "\" & sht.Name & ".xlsx"
Workbooks(2).Sheets(2).Delete
wk.SaveAs ss
wk.Close
Next
Application.DisplayAlerts = True
MsgBox "拆分工作簿完成!"
End Sub
这代码的bug在于,有且只有一张工作簿的时候才不会出错。这就意味着,要把其他所有的工作簿关掉。而且,还要把工作表移到有代码的那张工作表中,保存的路径也很粗暴。
既然牛都吹上天了,拿出这么个东西来,下次再吹牛的时候谁信呐。
于是,又摸索了找到了以下代码:
Sub 快速拆分工作簿()
Dim sht As Worksheet, mypath$
Application.DisplayAlerts = False
'取消显示系统警告和消息
Application.ScreenUpdating = False
'取消屏幕刷新
With Application.FileDialog(msoFileDialogFolderPicker)
'选择保存工作薄的文件路径
AllowMultiSelect = False
'不允许多选
If .Show Then
mypath = .SelectedItems(1)
'读取选择的文件路径
Else
Exit Sub
'如果没有选择保存路径,则退出程序
End If
End With
If Right(mypath, 1) <> "\" Then mypath = mypath & "\"
Application.DisplayAlerts = False
Application.ScreenUpdating = False
For Each sht In Worksheets
'遍历工作表
sht.Copy
'复制工作表,工作表单纯复制后,成为活动工作薄
With ActiveWorkbook
.SaveAs mypath & sht.Name, xlWorkbookDefault
'保存活动工作薄到指定路径下
.Close True '关闭工作薄
End With
Next
MsgBox "处理完成。", , "提醒"
Application.ScreenUpdating = True '恢复屏幕刷新
Application.DisplayAlerts = True '恢复显示系统警告和消息
End Sub
这次的宏不用关掉其他的工作簿了,还可以选择要保存的路径,尝试了几次,还是得把工作表移到代码所在的工作簿才会万无一失,跨工作簿使用偶尔也会出错。应该是for循环中的变量太宽泛了,又或者是其他的原因,总之,VBA不是很好,解决不了这个难题。
后来再继续找,没找到更好的代码,但是找到了一个别人写好的小程序。
下载一试,很完美。
安装好之后,会在Excel的菜单栏上多一栏,
点击“工作簿管理”出现这个界面
左边是可选工作表,把你想要拆分的工作表移到右边,在“目标文件夹”中选择拆分之后要保存的路径,点击拆分就完成了。
除了拆分,还有合并,可以把不同工作簿中的工作表合并到同一张工作簿中,操作跟拆分类似,区别在于选择“目标文件夹”不是保存路径,而是可选工作簿的来源。
嗯,就这么简单。它的名字叫易用宝,下载链接在文末,百度网盘链接。安装好之后需要激活码。我知道激活码是什么,但不能在这里告诉你们。安装好之后,随便点击其中一个功能,按照他们的提示去获取就行了,很简单,完全免费的。
这个小程序是excel home团队写的。在这里,向大神们致敬。
还有的小伙伴叫我推荐学excel的书,我觉得excel home的就不错,买过一本关于VBA基础。至于视频,在往期的文章里有链接。都是免费的,而且是良心干货。
这个小工具对于合并工作表,只能把工作表合并到工作簿中,还有没有实现把不同工作簿的工作表合并到一张工作表中。这个功能在office2016版本中,用一句SQL语句就能实现,而且能够随着数据源的更新而更新,很强大。之前的版本也能用,但有很多bug。
还有就是,一键生成银行询证函,生成企业询证函等等,这些等有空了再去研究研究。做为审计少年,这些东西应该懂,是吧?
虽然说,不会VBA也能拿着别人做好的模版来用,但我觉得,还是学一学VBA为好,因为别人的模版只是在一定情况下适用,只要发生一点小变化,不懂维护的话,就只能望洋兴叹了。听说我们所之前有个很厉害的大神,写了很多审计底稿模版,替代测试,凭证抽查什么的,一键就能生成。后来那位传说哥离职了,没人维护,全都没发用了。现在还能听到同事们经常提起,曾经的曾经,这儿存在着一位很牛逼的人物。