码迷,mamicode.com
首页 > 其他好文 > 详细

薪资表自动拆分和发送功能

时间:2015-05-29 23:12:45      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

        起因是这样的,俺家妹子在单位兼一些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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!