标签:
起因是这样的,俺家妹子在单位兼一些hr的工作,每个月要负责给所有人发工资条。工资条是以excel文件的形式,作为Email的附件发出。她有一张总表,每个月发完薪水,她都要把总表拆成一个个单独的附件,附件名以每位同事的名字命名,比如“李四.xls”,然后用Foxmail建立一封新邮件,填上地址、标题、正文,再把对应的附件默默地拖到邮件中,点击“发送”。还好单位人不多,五六十号人,发完所有工资条邮件,大概花费一个多小时。虽然总时间不多,但是每个月的这个时候,总有一股莫名的烦躁感╭(╯^╰)╮,跟大姨妈一样。。。得知此事后,身为程序猿的俺,强烈要求表现一下,做一个自动拆分和发送邮件的功能 O(∩_∩)O~
程序的功能主要是“拆分”和“发送”,但是这两种功能我都没写过,一时间不知道该用啥语言、用啥库,或者市面上是否有可用的工具软件?经过一下午的百度,看了几十个帖子、尝试了N个号称“薪资管理发送软件”后,终于定下来,“拆分”功能用VBA,“发送”功能用python的email模块实现。
先说拆分功能,一张薪资表结构可能如下
hr妹子们可能想拆成这样
和这样
就是每个人一个附件,附件的形式是前面有公共的表头,后面是每个人具体的数据,通常是每个人对应一行。这里是3+1的形式,“3行表头,1行数据”。
拆分功能如下,打开薪资excel表,假设总表就是第一张表,Sheet1(通常都是Sheet1,如果不是,自行激活相应表格)。激活Sheet1之后,按Alt + F11,打开VBA编辑器,如图:
在左边的列表中双击“Sheet1(Sheet1)”这项,激活右边的代码窗口,输入拆分代码
我们可以看到代码很简单,有两个函数,一个叫SplitRow,另一个叫SplitAll,待会儿说这两个函数。
保存好之后,不用退出VBA编辑器,回到Sheet1表格,在excel上面菜单栏中选择“宏”命令,如红框中所示:
在弹出的宏命令选择框中,可以看到刚才输入的函数SplitAll,点击“执行”就可以了。
为什么这里看到的是“Sheet1.SplitAll”,而不是"SplitAll",还记得吗,我们刚才是在左边列表中双击了“Sheet1(Sheet1)”这项,因此输入的代码归属于Sheet1表格,所以完整的函数名叫“Sheet1.SplitAll”。
执行完之后,可以看到结果,这里是输出到c: 根目录,输出目录可以自行修改,在函数“SplitRow”中。
执行过程中会看到一张张的excel表格打开又关闭,不停的闪烁,请不要惊慌~~
可以看到每个人都对应一个附件,可以打开附件检查结果是否正确。
这里文件后缀名是.xlsx,如果需要是.xls,修改函数"SplitRow"
代码如下:
Sub SplitRow(i As Integer)
Dim dst_book As Object
Dim dst_sh As Object
Set dst_book = Workbooks.Add ‘新增一个工作簿
Set dst_sh = dst_book.Sheets(1) ‘新增一张表
Rows(1).Copy dst_sh.Rows(1) ‘三行表头
Rows(2).Copy dst_sh.Rows(2)
Rows(3).Copy dst_sh.Rows(3)
Rows(i).Copy dst_sh.Rows(4) ‘一行数据
dst_book.SaveAs "c:\" & Cells(i, 2).Value & ".xlsx" ‘保存在c:\,文件名是单元格(i,2)的内容,后缀名是 .xlsx
dst_book.Close ‘总表中每行第2个单元格数据为“姓名”,以这个人的“姓名”为导出文件名,比如“张三.xlsx”
Set dst_sh = Nothing
Set dst_book = Nothing
End Sub
Sub SplitAll()
Dim i As Integer
Dim n As Integer
n = Range("A65536").End(xlUp).Row
For i = 4 To n
If Cells(i, 1).Value <> "" Then ‘对于每行数据,如果其第1个单元格不为空白,则进行导出
SplitRow (i) ‘总表中每行第1个单元格数据为“工号”,如果把这个人的“工号”删掉,则不会导出他的数据
End If
Next i
End Sub
如果不是“3行表头+1行数据”的形式,请自行修改代码。
PS:拆分五六十号人的数据大概需要十几秒,如果你们单位人很多,几百号人,还是要多等一会儿的。而且拆分期间,电脑最好不要用于其它工作。
标签:
原文地址:http://blog.csdn.net/unknowm/article/details/46241019