ARTICLE · 1133526
Excel VBA编程-一键批量生成工资条
Excel VBA编程-一键批量生成工资条
本期知识点来源(来自网络实战技巧)
上网搜"Excel 怎么批量做工资条",你会发现一个几乎人人都头疼的活儿:工资表是一整张,第一行是表头(姓名、部门、基本工资……),下面一人一行;可发工资条时,得让每个人"头顶都有自己的表头",才好裁开、打印、分发。
365办公网(ftv365.cn)、CSDN 博客、以及 allimg.cn 的教程都给出了同一个核心思路:从下往上,在每位员工的数据上方插入一行,把首行的表头复制过去。比如原始表有 50 名员工,运行一下,就自动变成 50 张"表头 + 本人数据"的小条,直接能裁。
今天我们把这个思路扩展成 3 个由浅入深的实战案例。核心就一句话:表头在第 1 行,从最后一行往上数,每人头顶补一张表头。
操作前准备:请在 Excel 里准备一张工资表,从 A1 单元格开始是表头,第 2 行起是每位员工的数据,中间不要有空行。后面三个案例都基于这个布局。
案例 1(简单):一键在每位员工上方插入表头
功能说明:运行后,VBA 会自动从最后一行往上,在每位员工的数据上方插入一行,并把第 1 行的表头复制过去。结果是每人一张"表头 + 本人数据",可以直接裁剪。代码最精简,适合第一次上手。
代码(按 Alt + F11 打开编辑器 → 菜单"插入"→"模块"→ 粘贴下面全部内容):
Sub 一键生成工资条() Dim 最后行 As Long Dim i As Long ' 找到 A 列最后一个有数据的行(也就是最后一名员工) 最后行 = Cells(Rows.Count, 1).End(xlUp).Row ' 从最后一名员工往上,到第 3 行为止(第 2 名员工头顶已有最上面的表头) For i = 最后行 To 3 Step -1 Rows(1).Copy ' 复制第 1 行表头 Rows(i).Insert Shift:=xlDown ' 在当前员工上方插入这一行 Next i MsgBox "工资条已生成,共 " & (最后行 - 1) & " 张!", vbInformationEnd Sub操作步骤:
在 Excel 中准备好工资表(A1 起表头,第 2 行起员工数据)。 按 Alt + F11打开 VBA 编辑器,点菜单"插入"→"模块"。把上面整段代码粘贴进去,关闭编辑器。 回到 Excel,按 Alt + F8,选中"一键生成工资条",点"运行"。稍等片刻,弹出提示即完成;此时每一名员工上方都已有一行表头,可以打印或裁开了。
案例 2(中等):生成带边框、表头加粗的规整工资条
功能说明:在案例 1 的基础上,自动给每张工资条的"表头行 + 数据行"加上细边框,并把表头加粗、列宽自适应,打印出来更整齐好看。逻辑和案例 1 完全一样,只是每插好一张就顺手把它打扮一下。
代码(新建一个模块,粘贴下面全部内容):
Sub 生成工资条带格式() Dim 最后行 As Long Dim 列数 As Long Dim i As Long 最后行 = Cells(Rows.Count, 1).End(xlUp).Row ' 找到表头共有多少列(从 A1 往右数到最后一个有内容的列) 列数 = Cells(1, Columns.Count).End(xlToLeft).Column For i = 最后行 To 3 Step -1 Rows(1).Copy Rows(i).Insert Shift:=xlDown ' 表头这一行加粗 Range(Cells(i, 1), Cells(i, 列数)).Font.Bold = True ' 给"表头行 + 数据行"这一整块加上细边框 With Range(Cells(i, 1), Cells(i + 1, 列数)).Borders .LineStyle = xlContinuous .Weight = xlThin End With Next i ' 列宽自适应,打印更美观 Columns.AutoFit MsgBox "工资条已生成并排版,共 " & (最后行 - 1) & " 张。", vbInformationEnd Sub操作步骤:
准备好工资表(同案例 1 的布局要求)。 Alt + F11→ "插入"→"模块",粘贴上面代码,关闭编辑器。Alt + F8运行"生成工资条带格式"。运行后,每张工资条都有边框、表头加粗,列宽也自动调好,直接打印即可。
小提示:如果只想看效果、怕改乱原表,建议先复制一份工资表再运行。
案例 3(实用):把工资条生成到新表,每张带标题,原表不动
功能说明:前面两个案例都是直接改当前表。这个实用版更稳妥:原工资表一点不动,VBA 会自动新建一张叫"工资条"的表,把每位员工的工资条搬过去,并且在每张上方加上"★ 张三 的工资条 ★"这样的标题,自带边框,方便整张打印或发给 HR。适合每月固定出工资条的场景。
代码(新建一个模块,粘贴下面全部内容):
Sub 生成工资条到新表() Dim 源表 As Worksheet Dim 新表 As Worksheet Dim 最后行 As Long Dim 列数 As Long Dim i As Long Dim 新行 As Long Set 源表 = ActiveSheet 最后行 = 源表.Cells(源表.Rows.Count, 1).End(xlUp).Row 列数 = 源表.Cells(1, 源表.Columns.Count).End(xlToLeft).Column ' 如果已经有一张《工资条》表,先删掉,避免重名报错 Application.DisplayAlerts = False On Error Resume Next Sheets("工资条").Delete On Error GoTo 0 Application.DisplayAlerts = True ' 新建一张工作表专门放工资条 Set 新表 = Sheets.Add(After:=Sheets(Sheets.Count)) 新表.Name = "工资条" 新行 = 1 For i = 2 To 最后行 ' 1. 写这张工资条的标题(用第 1 列的姓名) 新表.Cells(新行, 1).Value = "★ " & 源表.Cells(i, 1).Value & " 的工资条 ★" 新行 = 新行 + 1 ' 2. 复制表头 源表.Rows(1).Copy 新表.Rows(新行) 新行 = 新行 + 1 ' 3. 复制这名员工的数据 源表.Rows(i).Copy 新表.Rows(新行) 新行 = 新行 + 1 ' 4. 表头加粗、整张加边框 新表.Rows(新行 - 2).Font.Bold = True With 新表.Range(新表.Cells(新行 - 2, 1), 新表.Cells(新行 - 1, 列数)).Borders .LineStyle = xlContinuous .Weight = xlThin End With ' 5. 留一个空行,分隔下一张 新行 = 新行 + 1 Next i 新表.Columns.AutoFit MsgBox "工资条已生成到新表《工资条》,原表未改动,共 " & (最后行 - 1) & " 张。", vbInformationEnd Sub操作步骤:
在 Excel 里打开工资表,确认 A1 起是表头、第 2 行起是员工数据。 Alt + F11→ "插入"→"模块",粘贴上面代码,关闭编辑器。回到 Excel,按 Alt + F8运行"生成工资条到新表"。运行后,工作簿里会多出一张"工资条"表:每位员工一张,上方有姓名标题、带边框,原工资表原封不动。 直接打印这张新表,或另存发给 HR 即可。
小提示:标题里的姓名取的是第 1 列(A 列)。如果你的姓名不在 A 列,把代码里
源表.Cells(i, 1)的1改成姓名所在列的列号即可(比如 B 列就改成2)。