现在大部分公司的工资条,应该都是走线上了,尤其是钉钉的工资条,非常清晰。我记得很久很久以前,工资条应该都是一张纸剪开,然后发到各个员工的手里的。而这种情况,就非常需要知道如何只做工资条。
比如我们拿到的原表是这样的:

但是我们希望它最后变成这样,我们才好用剪刀剪了发给员工。

这个其实很简单,复制下面这段代码到EXCEL里,就可以使用了。代码的注释还是非常详细的。
Option Explicit
Public clo_start As String
Sub main()
'这里用了input来接受使用时所指定的列
'这里没有作非法验证,考虑的填入的参数较为简单
clo_start = InputBox("请输入需要操作的列(如果是A列,则填A即可)")
Call add_space(clo_start)
End Sub
'clo_num:该区域有多少列,返回一个数字
'row_num:该区域有多少行,返回一个数字,另外从尾开始遍历到头部时,需要使用这个变量
'head_rng_content:表头
Private Sub add_space(which_clo As String)
Dim head_rng_content As Range
Dim clo_num As Integer
Dim row_num As Long
Dim cursor As Long
Set head_rng_content = Range(Cells(1, 1), Cells(1, 1).End(xlToRight))
clo_num = get_clo_num()
row_num = get_row_num()
'到第3行的时候,前面已经不可能有不同的值了,因为第2行是数据,第1行是表头
'所以这边遍历到第3行就可以了
For cursor = row_num To 3 Step -1
If Cells(cursor, which_clo) <> Cells(cursor - 1, which_clo) Then
'resize这边更改整个区域,这边是2,原本是1行,变更一下就是2行
'然后insert的时候,也是插入两行,留了一个表头的位置
Rows(cursor).Resize(2).Insert
'把表头复制过去,这边为什么是+1,因为第6行和第5行不同,
'因此第6和第5行之间插入2行,
'原先第6行到第8行,第7行是表头的位置。
head_rng_content.Copy Range(Cells(cursor + 1, 1), Cells(cursor + 1, clo_num))
End If
Next
End Sub
'返回一整个区域的列数
Private Function get_clo_num()
Dim clo_num As Integer
Dim clo_rng As Range
Set clo_rng = Range(Cells(1, 1), Cells(1, 1).End(xlToRight))
'这里用了counta来计算非空单元格的数量
'因此这边选定的range范围是第一行
clo_num = Application.WorksheetFunction.CountA(clo_rng)
get_clo_num = clo_num
End Function
'返回一整个区域的行数(表头已经包括)
Private Function get_row_num()
Dim row_num As Long
Dim row_rng As Range
Set row_rng = Range(Cells(1, 1), Cells(1, 1).End(xlDown))
'这里用了counta来计算非空单元格的数量
'因此这边选定的range范围是第一列
row_num = Application.WorksheetFunction.CountA(row_rng)
get_row_num = row_num
End Function
网友评论