免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 1818|回复: 0
收起左侧

[资料] 工资条问题

[复制链接]

7656

主题

1175

铜板

2299

好友

技术员

为地信喝彩!

积分
106237
QQ
发表于 2010-6-7 22:39 | 显示全部楼层 |阅读模式
职工工资构成非常复杂,往往超过10项,因此每月发工资时要向职工提供一包含工资各构成部分的项目名称和具体数值的工资条。打印工资条时要求在每个职工的工资条间有一空行便于彼此裁开。本模板就是用EXCEL函数根据工资清单生成一便于分割含有工资细目的工资条表格。
本工资簿包含两张工资表。第1张工资表就是工资清单,称为"清单"。它第一行为标题行包括职工姓名、各工资细目。
第2张工作表就是供打印的表,称为"工资条"。它应设置为每三行一组,每组第一行为标题,第二为姓名和各项工资数据,第三行为空白行。就是说整张表被3除余1的行为标题行,被3除余2的行为包括职工姓名、各项工资数据的行,能被3整除的行为为空行。
在某一单元格输入套用函数"=MOD(ROW(),3)",它的值就是该单元格所在行被3除的余数。因此用此函数能判别该行是标题行、数据行还是空行。
在A1单元格输入公式"=IF(MOD(ROW(),3)=0,"",IF(MOD(ROW(),3)=1,清单!A$1,"value-if-false"))"并往下填充,从A1单元格开始在A列各单元格的值分别为清单A1单元格的值即姓名、value-if-false、空白,姓名、value-if-false、空白,......。其中value-if-false表示MOD(ROW(),3)既不等于0又不等于1时,即它等于2时应取的值。它可用如下函数来赋值:"INDEX(清单!$AG,INT((ROW()+4)/3),COLUMN())"。INDEX()为一查找函数它的格式为:INDEX(reference,row-num,col-num),其中reference为查找的区域,本例中为清单表中的A到G列,即函数中的"清单!$A:$G",row-num为被查找区域中的行序数即函数中的INT((ROW()+4)/3),col-num为被查找区域中的列序数即函数中的COLUMN()。第2、5、8.......行的行号代入INT((ROW()+4)/3)正好是2、3、4......,COLUMN()在A列为1。因此公式"=INDEX(清单!$A:$G,INT((ROW()+4)/3),COLUMN())"输入A列后,A2、A5、A8......单元格的值正好是清单A2、A3、A4......,单元格的值。这样,表的完整的公式应为"=IF(MOD(ROW(),3)=0,"",IF(MOD(ROW(),3)=1,清单!A$1,INDEX(清单!$A:$G,INT((ROW()+4)/3),COLUMN())))"。把此公式输入A1单元格,然后向下向右填充得到了完整的工资条表。
为了表格的美观还应对格式进行设置,一般习惯包括标题、姓名等文字在单元格中要取中,数字要右置,数字小数点位数也应一致,还有根据个人的爱好设置边框。本表格只需对一至三行的单元格进行设置,然后通过选择性格式设置完成全表的设置。
本工作簿的特点是1、不对清单表进行操作保持清单工作表的完整,2、全工作表只有一个公式通过填充得到全表十分方便。
例如:我的单位不大不小,有200多号人。最近领导要求把每个员工个人的工资情况打出来,分发给每位员工。每个员工的工资条上只能有两行内容:一行是分解的项目内容,如基本工资、岗位工资、总计等等;另一行是对应第一行的具体工资数额。
可以这样解决:
Sheet2
1.A1命名为
K
2.A3:A250命名为
XX
A3贴上主索引,数据要连续中间不允许有空格

3.写公式
=VLOOKUP(K,DATA,2,0)
有几个字段写几个,位置随您高兴摆

4.隐藏A

**************************************************************************************
Sub 打印
()
Application.ScreenUpdating = False '屏幕不更新

Dim c As Object '宣告c为对象,请准备空间

[xx].Select '选取变量范围

Set c = ActiveCell '设定c对象为作用单元格

Do Until IsEmpty(c.Value) 'Do循环直到无值时跳出

[k].Value = c.Value
Set c = c.Offset(1, 0) '设定c往下进一格再取主索引值

Sheets("Sheet2").PrintPreview '工作表直接打印改
PrintOut
Loop


End Sub
另一回答:我是做人事管理的也遇到过你的问题,我用如下方法解决十分方便,而不用任何代码.
方法的原理是调整打印机的自定义纸张大小到恰好显示一个人的工资条的大小,请按如下:
如:我的excel工资表将项目内容放在第一、二行,行高为20.1,用a4纸横向打印
1、在页面设置中将上、下边距,页眉、页脚均设为零,
在页面设置--工作表---顶端标题行 中输入 $1:$2,即将放在
一、二行的项目内容设成每页标题行
打印方向为横向
2、、在文件----打印---属性---纸张----自定义中将纸张的
宽度=280 (单位:毫米)
长度=2970 (单位:毫米)
3、打印时可选1---200页,即可打印200人的工资条,一张a4可打10
确定后预览,可调整下边距至每页显示一张工资条
我的解决办法:我只用了一个公式: if(mod(row(),3)=0,"",if(mod(row)(),3)=1,sheet1!a$1,index(sheet1!$a:$g,int((row()+4/3),cllolumn())))你试一下
(解释:int((row()+4/3) 是这个意思:一个工资表,有列标题,接下来是工资记录。而我在此表基础上,加一个自动生 成的工资 条表, mod(row(),3)=0,在此表上用这个表示第三行保留空白行; if(mod(row)(),3)=1,sheet1!a$1,表示是第一行取标题列; index(sheet1!$a:$g,int((row()+4/3),column())这是关键的地方:是指它不是第一行,也不三倍数的行,是记录 行的表示,你想第二行显示记录,则2+4/3=2 取工资 表的第二行记录;第五行显示记录,则5+4/3=3 取工资 表的第三行记录;第八行显示记录,则8+4/3=4 取工资 表的第四行记录;第十一行显示记录,则11+4/3=5 取工资 表的第五行记录;这个公式你可以根据具体情况变化:尤其是((row()+4/3),中的4这个数字。
地质啷http://weibo.com/943569550
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表