标题: [已解决]VBS处理考勤报表(100元有偿) [打印本页]
作者: fcxk 时间: 2015-11-25 19:33 标题: [已解决]VBS处理考勤报表(100元有偿)
内容与说明在附件“结果表格”
注意:源表格文件名有[]符号,要求处理目录下所有xls表格(现实只有一个表格。但表格名不确定、带有[]符号)
要求日期从 1-31 ,星期一到星期五,排序,删除上班或下班重复打卡时间,提取最前打卡时间为准、
信誉方面:请放心,只要采纳了、百分百支付
aa77dd@163.com(已解决)已经交易
作者: aa77dd@163.com 时间: 2015-11-25 20:03
请问楼主的结果表格是如何得到的, 看到 把 2800+ 行数据整理成了 1800+ 行数据, 我了解的考勤机通常都带软件的, 当然不一定易用
作者: fcxk 时间: 2015-11-25 20:06
这个是服务器下载下来的
作者: fcxk 时间: 2015-11-25 20:07
回复 2# aa77dd@163.com
这个是服务器下载下来的
作者: 523066680 时间: 2015-11-26 00:14
本帖最后由 523066680 于 2015-11-26 00:17 编辑
你们公司员工姓名……,做过化名处理没有
作者: 依山居 时间: 2015-11-26 00:37
谁啊,老设置成作者可见。
作者: CrLf 时间: 2015-11-26 02:46
回复 6# 依山居
因为是 『有偿求助区』
作者: fcxk 时间: 2015-11-26 08:38
回复 5# 523066680
没有,是原名
作者: zrc20d 时间: 2015-11-26 13:11
必须是vbs吗
作者: fcxk 时间: 2015-11-26 13:19
回复 9# zrc20d
只要方法快就行, VBS更好,数据条有很多,有时会有十万条
作者: wankoilz 时间: 2015-11-26 13:32 标题: 标题
本帖最后由 wankoilz 于 2015-11-26 13:55 编辑
练习awk!!
将源文件导出为csv文件(逗号分隔),拖拽执行,得到result.csv- # & cls & gawk -f %0 %1 & pause & exit
- BEGIN{
- FS=",| "
- check[1][1]=600;check[1][2]=815;check[1][3]=1111;check[1][4]=1230
- check[2][1]=1400;check[2][2]=1500;check[2][3]=1610;check[2][4]=1810
- check[3][1]=1830;check[3][2]=1910;check[3][3]=2100;check[3][4]=2200
- }
- NR>1{
- sub(/:/,"",$8)
- arr[$3][$7]=arr[$3][$7]""$8" "
- }
- END{
- #统计数据
- asorti(arr,ta)
- for(id in ta){
- name=ta[id]
- for(day in arr[name]){
- split(arr[name][day],arrTime," ")
- for(x in check){
- earlierFlag=0;laterFlag=0
- for(y in arrTime){
- if(arrTime[y]>=check[x][1]&&arrTime[y]<=check[x][2]){earlierFlag=1;earlierTime=arrTime[y]}
- if(arrTime[y]>=check[x][3]&&arrTime[y]<=check[x][4]){laterFlag=1;laterTime=arrTime[y]}
- }
- #分类统计几种情况
- if(earlierFlag && laterFlag){
- sub(earlierTime,"",arr[name][day])
- sub(laterTime,"",arr[name][day])
- arr[name"-"day]=arr[name"-"day]" "earlierTime","laterTime",1,"
- sTmp="";arrTotal[name]++
- if(earlierTime>=1830){sTmp="1,"}else{sTmp=","}
- fday=gensub("/"," ","g",day)
- weekday=strftime("%A",mktime(fday" 0 0 0"))
- if((weekday=="星期二"||weekday=="星期四")&&earlierTime<=730){
- sTmp=sTmp"1,"
- }else{
- sTmp=sTmp","
- }
- if(weekday=="星期一"&&earlierTime<=720){sTmp=sTmp"1,"}else{sTmp=sTmp","}
- arr[name"-"day]=arr[name"-"day]""sTmp
- }
- }
- }
- }
- #打印处理
- print "姓名,打卡日期,星期,上班,下班,考勤段数,晚修段,早读,升旗,个人总段" >"result.csv"
- for(id in ta){
- name=ta[id]
- for(day in arr[name]){
- fday=gensub("/"," ","g",day)
- weekday=strftime("%A",mktime(fday" 0 0 0"))
- split(arr[name][day],arrTime," ")
- for(x in arrTime){
- if(!isFirst[name]++){
- tPrint=name","day","weekday","arrTime[x]",,,,,,"arrTotal[name]
- }else{
- tPrint=","day","weekday","arrTime[x]
- }
- sPrint=sPrint""tPrint"\n"
- }
- if(length(arr[name"-"day])){
- split(arr[name"-"day],arrRight," ")
- for(x in arrRight){
- if(!isFirst[name]++){
- tPrint=name","day","weekday","arrRight[x]""arrTotal[name]
- }else{
- tPrint=","day","weekday","arrRight[x]
- }
- sPrint=sPrint""tPrint"\n"
- }
- }
- }
- }
- #去掉最后一个换行符
- sPrint=substr(sPrint,1,length(sPrint)-1)
- split(sPrint,arrLine,"\n")
- #处理时间格式
- for(x in arrLine){
- split(arrLine[x],arrCol,",");arrLine[x]=""
- len=length(arrCol[4])
- arrCol[4]=substr(arrCol[4],1,len-2)":"substr(arrCol[4],len-1,2)
- if(len=length(arrCol[5])){
- arrCol[5]=substr(arrCol[5],1,len-2)":"substr(arrCol[5],len-1,2)
- }
- for(y in arrCol){arrLine[x]=arrLine[x]""arrCol[y]","}
- lines=lines""arrLine[x]"\n"
- }
- print lines >>"result.csv"
- }
复制代码
gawk 4.1.0 下载地址:http://www.bathome.net/viewthread.php?tid=21366&highlight=gawk
作者: fcxk 时间: 2015-11-26 13:48
回复 11# wankoilz
看清说明:是xls
作者: fcxk 时间: 2015-11-26 14:01
回复 11# wankoilz
我要的是直接处理xls表格
上班与下班时间没有分开,比哪上班打了,下班没有打,下班时间段单元格为空。还有升旗与早读也没有判断
作者: fcxk 时间: 2015-11-26 14:04
回复 11# wankoilz
星期判断也有误,没有看到星期1,还有星期六与日是不存在日期里的,因为我在表格里自动换星期全是在1到5的
作者: zrc20d 时间: 2015-11-26 16:03
xls里的要求,有些描述不是特别清楚,这4个小问题:
满足以上任一条件:下班时间移动到"正常下班"对应列,并在考勤列增加 "1" 对应
problem1:"正常下班"对应列 是不是[下班]列?
星期二、星期四 上班:07:30分之内 、在早读列增加"1"
problem2:是否要求满足"条件1"?
还是
只要上班打卡时间在06:00-07:30之间 即可?
星期一 上班:07:20分之内、在升旗列增加"1"
problem3:是否要求满足"条件1"?
还是
只要上班打卡时间在06:00-07:20之间 即可?
自动调整每个条件的上班与下班时间匹配、没有时间的为空格。
problem4:如果有打卡时间,但是不符合三个条件中的任何一个,即时间在要求打卡的时间之外
那么:打卡时间是否要记录?相应的打卡记录是否要标记为1
作者: wankoilz 时间: 2015-11-26 16:18
回复 14# fcxk
我这儿是对的
1.结果是有周末信息,你 结果.xls 里面也有周末的刷卡信息
2.其他统计正常,唯一不足是日期排列顺序不规则
3.csv文件可以直接用excel导入,再另存为xls
4.说这些并非要楼主采纳哈,仅仅想说明除了日期排列不规则,我的代码能完成其他要求
作者: fcxk 时间: 2015-11-26 16:25
回复 16# wankoilz
对啊, 排序也有问题。很乱
作者: fcxk 时间: 2015-11-26 16:35
本帖最后由 fcxk 于 2015-11-26 16:39 编辑
回复 15# zrc20d
1.满足以上任一条件:下班时间移动到"正常下班"对应列,并在考勤列增加 "1" 对应
比如:源文件里
07:20分上班,
11:10分下班
是同一列
要求把:上班下班分成两列,07:20分在上班列,11:10分在下班列,满足条件时:考勤列加1,不满足时,考勤列不处理。
2.星期二、星期四 上班:07:30分之内 、在早读列增加"1
只是判断上班时间,只要上班打卡时间在06:00-07:20之间 即可
3.自动调整每个条件的上班与下班时间匹配、没有时间的为空格。
前面第一有说明、没有时间为空格,比如:上班 07:20分,下班没有打卡,所以下班为空格。空格就是没有数据,没有打卡。
每个时间段源文件有说明、比如:16号,打卡的时间为:
07:20
14:20
21:10
则说明:上班为07:20 下班为空
上班为14:20 下班为空
晚修上班为空、 下班21:10
空就是没有打卡
作者: zrc20d 时间: 2015-11-26 17:21
回复 18# fcxk
好的,thx
作者: 523066680 时间: 2015-11-26 19:59
在结果.xls 里面,有个:
陈云琳
2015/11/11 星期三 7:49
2015/11/11 星期三 7:19
7:49算啥?
作者: aa77dd@163.com 时间: 2015-11-26 20:10
回复 20# 523066680
早班上班的重复打卡, 只保留一个有效的记录 7:19
作者: fcxk 时间: 2015-11-26 20:11
回复 20# 523066680
条件时段:同一日期出现双上班或下班时间,提取最先一次时间,意思就是删除7:49,上班时间为7:19分,下班为空。
作者: aa77dd@163.com 时间: 2015-11-26 20:25
回复 22# fcxk
谢永香 2015-11-20 7:10 2015-11-20 星期五
谢永香 2015-11-20 11:08 2015-11-20 星期五
谢永香 2015-11-20 11:15 2015-11-20 星期五
上面情形怎么处理? 7:10 是有效上班打卡, 而 11:08 下班打卡时间未到, 是否算早退, 11:15 是否计作有效下班打卡
作者: wankoilz 时间: 2015-11-26 20:27
回复 17# fcxk
不知道为什么你那边星期显示不对,太累不想弄了,等其他兄弟发挥。
作者: fcxk 时间: 2015-11-26 20:27
回复 23# aa77dd@163.com
算11:08分 首次打卡时间为准
作者: fcxk 时间: 2015-11-26 20:30
本帖最后由 fcxk 于 2015-11-26 20:37 编辑
回复 24# wankoilz
我查到问题了 fday=gensub("/"," ","g",day) 改成:fday=gensub("-"," ","g",day)
但与要求还差好多地方不足,排序不了,重复时间没判断,下班时间没调整
作者: aa77dd@163.com 时间: 2015-11-26 20:45
本帖最后由 aa77dd@163.com 于 2015-11-26 20:48 编辑
回复 25# fcxk
条件1:同一日期 上班:06:00分 - 08:15分、下班:11:11分-12:30分
11:08 不在有效打卡时间内, 算 11:08 岂不是早退了.
而且 你附件中的结果 也是没算 11:08 的, 而是把之后的 11:15 列在了有考勤段 1 的行里
谢永香 2015-11-1 星期日 15:53
2015-11-10 星期二 7:15
2015-11-11 星期三 14:47
2015-11-12 星期四 7:35
2015-11-16 星期一 7:06 11:19 1
2015-11-16 星期一 14:37 16:40 1
2015-11-18 星期三 7:37 11:10 1
2015-11-20 星期五 11:08
2015-11-20 星期五 7:10 11:15 1
请楼主把 重复打卡, 打卡有效性, 迟到, 早退 各情形的规则整理得更清晰, 严谨, 明确, 这是保证代码达成需求的基本前提
作者: wankoilz 时间: 2015-11-26 20:45 标题: 标题
回复 26# fcxk
好的,知道了,坐等吧。
作者: 523066680 时间: 2015-11-26 20:55
回复 24# wankoilz
感觉里面有很多不必要的细节问题,果然还是去做点别的什么比较有意义。(嘴上说不做身体却很诚实?
作者: fcxk 时间: 2015-11-26 20:55
本帖最后由 fcxk 于 2015-11-26 20:57 编辑
回复 27# aa77dd@163.com
迟到:上班时间为准:半小时内为:比如:07:30为上班、07:31到08:00为迟到
早退:迟到时间到下班时间内:比如:下班时间:11:10分、 08:00到11:09分为早退
谢谢提醒
作者: 523066680 时间: 2015-11-26 21:09
本帖最后由 523066680 于 2015-11-26 21:10 编辑
结果如果分成6列:
上午: 下午: 夜班:
上班下班 上班下班 上班下班
这样分就比较清晰
作者: fcxk 时间: 2015-11-26 21:11
本帖最后由 fcxk 于 2015-11-26 21:14 编辑
回复 31# 523066680
太多列打印纸怕不够宽啊A3纸
直接分上班与下班就行,多谢好心
作者: wankoilz 时间: 2015-11-26 21:15 标题: 标题
回复 29# 523066680
说到点上了,我就老是身体不诚实
作者: 523066680 时间: 2015-11-26 21:16
本帖最后由 523066680 于 2015-11-26 21:20 编辑
回复 33# wankoilz
你们的精神损失费绝对不止100块,纯属折腾上了就放不下了
另外A4都放得下别说A3。
作者: fcxk 时间: 2015-11-26 21:20
回复 34# 523066680
我想更好的啊,关键是现在还没有代码出来啊
作者: 523066680 时间: 2015-11-26 21:24
本帖最后由 523066680 于 2015-11-26 21:26 编辑
回复 35# fcxk
我也经营工厂的,这种问题,对我来说,换个打卡机更容易
作者: aa77dd@163.com 时间: 2015-11-26 21:26
回复 30# fcxk
1.
楼主还是没有回答清楚这个问题:
这是楼主附件结果中的- 2015-11-20 星期五 11:08
- 2015-11-20 星期五 7:10 11:15 1
复制代码
我就这样理解了, 在 6 个打卡时间段外的打卡记录全作无效处理, 上面 11:08 在 11:11分-12:30分 时间段之前, 也不在任何其他打卡时间段内, 所以作无效记录处理, 和楼主的顶楼附件结果也是一致的- 条件1:同一日期 上班:06:00分 - 08:15分、下班:11:11分-12:30分
-
- 条件2:同一日期 上班:14:00分 - 15:00分 、下班:16:10分 - 18:10分
-
- 条件3:同一日期 晚修:18:30 - 19:10 下班:21:00 - 22:00分
复制代码
2.
所有考勤段数那一列的计算 都是不管上面说的无效记录的, 就象那个时间没打过卡一样
3.
关于 早读 和 升旗:
A. 07:30分之内 是指打卡时间 <= 07:30:00, 是吧?
B. 如果打卡时间特别早, 甚至到了 06:00分 - 08:15分 这个时间段之前, 比如 05:53 , 那么这也算有效吗?
C. 如果某天(周二或周四)有 07:30 分之前的有效上班打卡记录, 但没有任何有效的下班打卡记录, 是否还是一样把 早读 也计 1?
星期二、星期四、上班:07:30分之内 、在早读列增加“1”
星期一:上班:07:20分之内、在升旗列增加“1”
4.
总考勤数的计算, 是否只是计入 早, 午, 晚班(任何班次只作 1 计算)?
早读, 升旗是否与总考勤数计算无关?
作者: fcxk 时间: 2015-11-26 21:27
回复 36# 523066680
不一样的,我们有其他的安全系统,是一系列的,因为系统出来数据与其他系统是相匹配的
作者: aa77dd@163.com 时间: 2015-11-26 21:31
回复 36# 523066680
话说考勤机也是折腾过, 各种考勤管理软件 易用性, 功能灵活性也参差不齐吧, 遇到的会计看着软件也是干瞪眼, 基本没用它, 而是把考勤记录导出表格手工整理
还有的不过把考勤机当个摆设罢了, 算考勤时睁只眼, 闭只眼差不多就行了
作者: aa77dd@163.com 时间: 2015-11-26 21:34
回复 38# fcxk
楼主请回答一下 37楼 的几个问题,
我的 VBA 代码编写就可以收尾了
作者: fcxk 时间: 2015-11-26 21:39
本帖最后由 fcxk 于 2015-11-26 21:42 编辑
回复 37# aa77dd@163.com
1.的问题是没考虑到重复打卡的问题,所以有一点错误,要以最前一次打卡为准,
2.早读是:06:00-07:30内才有效(每周星期二与星期四) 升旗是06:00-07:20分才有效(每周星期一) (这两点只判断上班,有效时在早读或升旗记1)
06:00之前时间打卡可以不用去理,因为不可能有这么早来的,就算来了也进不了门的
3.总考勤:是指考勤段数有效记1的总和 :比如:满足条件1或2或3会记录1、(早读,升旗的记数1是不在总考勤统计)
作者: aa77dd@163.com 时间: 2015-11-26 21:46
本帖最后由 aa77dd@163.com 于 2015-11-26 21:48 编辑
回复 41# fcxk
条件1:同一日期 上班:06:00分 - 08:15分、下班:11:11分-12:30分
7:10 满足上班打卡时间段
但 11:08 早于 11:11 分, 所以不满足条件 1, 所以 考勤段数 不能 计 1
那么结果要处理成这样吗:
2015-11-20 星期五 11:15 ' 无效重复打卡记录
2015-11-20 星期五 7:10 11:08 虽有两个时间 但考勤段仍不计 1
对于 有效 考勤记录 必须有清晰严谨的定义, 这样子前后矛盾, 无法继续下去了
作者: fcxk 时间: 2015-11-26 21:49
本帖最后由 fcxk 于 2015-11-26 21:52 编辑
回复 42# aa77dd@163.com
是的,但重复无效的要删除
015-11-20 星期五 7:10 11:08 只保留这个记录
作者: aa77dd@163.com 时间: 2015-11-26 21:59
回复 43# fcxk
11:08 没有明确的依据判断为 下班打卡记录
比如邻近的还有在 10:21, 10:35, 10:57 都有记录, 那么究竟把哪个判断为下班打卡
再更复杂些, 假设有 8:42, 9:30, 10:21, 10:35, 10:57 这些记录, 但在 8:15 分之前没有任何记录
那么究竟把哪一个当作上班记录, 哪一个作下班记录, 依据是什么???
作者: fcxk 时间: 2015-11-26 22:01
回复 44# aa77dd@163.com
系统源文件最多保留两个记录的,以最前一次打卡为准
作者: aa77dd@163.com 时间: 2015-11-26 22:04
回复 45# fcxk
只有 10:21, 10:35 的话, 怎么算
作者: 523066680 时间: 2015-11-26 22:04
回复 44# aa77dd@163.com
哈哈哈~ 其实应该按旷工处置。管他的。
作者: aa77dd@163.com 时间: 2015-11-26 22:05
回复 45# fcxk
在怎样的一个时间段内 最多保留两个记录 ?????
一天正常考勤可以有四个记录
作者: aa77dd@163.com 时间: 2015-11-26 22:07
回复 47# 523066680
旷工对人理解是好说哦, 但代码是逻辑和算术啊, 没有准确的定义, 就不可能有正确的代码
作者: fcxk 时间: 2015-11-26 22:07
回复 46# aa77dd@163.com
这个就是:上班为空,下班为:10:21
作者: aa77dd@163.com 时间: 2015-11-26 22:08
回复 50# fcxk
为什么呢, 为什么没有能算成 上班的打卡
作者: fcxk 时间: 2015-11-26 22:09
回复 48# aa77dd@163.com
三个条件的上班与下班的条件任一个条件时,系统会自动保留二条记录:比如你上班:打了五次卡,系统保留的只是第一次与最后一次打卡时间、下班也是一样
所以以首次打卡为准
作者: aa77dd@163.com 时间: 2015-11-26 22:10
回复 52# fcxk
10:21 和任何一个条件都不相符啊, 怎么判断的???
作者: fcxk 时间: 2015-11-26 22:12
回复 51# aa77dd@163.com
10:21分自然是下班段,这个学校会有安排的,不用去理他,你按出现二次打卡时间时,以首次时间为准就行
作者: aa77dd@163.com 时间: 2015-11-26 22:16
回复 54# fcxk
现在的计算机是以精确计算为基础的, 你不能给出精确的定义, 我也不想继续写了
精确的定义并没有多难, 只是所有定义要把所有情况都覆盖到, 而且互相之间不可以矛盾
比如这个时间, 你能不能给出 如果在 几点几分后 算 下班打卡, 否则算上班打卡
代码不是人啊, 不可能懂得 "自然" 的意义的
作者: fcxk 时间: 2015-11-26 22:24
本帖最后由 fcxk 于 2015-11-26 22:33 编辑
回复 55# aa77dd@163.com
06:00到10:00分为上班时间记录提取: 10:01分到12:30分为下班时间记录提取
14:00到15:40分为上班时间记录提取: 15:41分到18:10分为下班时间记录提取
18:30分到20:00分上班时间记录提取: 20:01分到22:00分为下班时间记录提取
比如:打卡时间出现:10:02分、12:00分、记录:上班为空:下班为:12:00分
更正一下:
上班出现重复时:以首次为准:
下班出现重复时:判断上班时间是否为空:要是为空记录提取最后一次下班时间为准:要是上班记录存在,则提取下班首次打卡时间
作者: 523066680 时间: 2015-11-26 22:45
回复 49# aa77dd@163.com
我去做一个简单点的程序,准备发布~
作者: aa77dd@163.com 时间: 2015-11-26 22:52
回复 57# 523066680
简单好, 越简单, 越清晰 越复杂, 越可能乱, 乱成一团麻
作者: 523066680 时间: 2015-11-26 22:52
回复 58# aa77dd@163.com
第三方的一个小程序
作者: aa77dd@163.com 时间: 2015-11-26 22:56
回复 56# fcxk
我再按下面的理解来修改代码
06:00--12:30
14:00--18:10
18:30--22:00
以上三个时间段之外的任何打卡记录视为完全无效记录, 不参与 任何计算 任何统计
按上下班时间划分的同一上班段 的多个记录只计最早的一个
按上下班时间划分的同一下班段 的多个记录: 如果没有对应的上班记录, 则取最晚的一个下班记录, 否则取最早的的一个下班记录
TLogInB = Array("06:00", "14:00", "18:30")
TLogInE = Array("08:15", "15:00", "19:10")
TLogOffB = Array("11:11", "16:10", "21:00")
TLogOffE = Array("12:30", "18:10", "22:00")
不在上述时间点定义的 6 个打卡时间段内的记录, 不参与 考勤段数 计数
作者: fcxk 时间: 2015-11-26 23:20
回复 60# aa77dd@163.com
更正上面回答
1.出现下班时间重复的,判断上班是否空,是空的话,提取首个记录为上班,最后一个记录为下班
要是上班存在,则取首个记录为下班
2.上班出现重复的,同理。判断下班是否空,空的话,首个记录为上班,最后一个记录为下班
存在的话,则提取首个记录为上班,删除最后上班记录
作者: fcxk 时间: 2015-11-26 23:29
回复 60# aa77dd@163.com
对的,考勤统计是这样
作者: Demon 时间: 2015-11-27 00:40
乱七八糟
作者: aa77dd@163.com 时间: 2015-11-27 00:47
本帖最后由 aa77dd@163.com 于 2015-11-27 00:48 编辑
回复 61# fcxk
你的定义改来改去令人沮丧, 真很沮丧啊 沮丧得我投降了!!!
楼主可知道通常考勤最简易的管理是 人员分班次, 班次时间只取头尾
比如 班次有 早班 [7:00--15:00] 晚班[10:00--18:00]
任何人员都会分配到这两个班次中的一个
而考勤机上每天不管打了多少记录, 只取最早的和最晚的两个记录来计算, 无记录作旷工, 只有一个记录的和班次时间段中心时间点(或别的定义好的时间点)比较后算上班记录或下班记录, 出勤情况需另行核实
这种计算统计方法, 简洁明了, 易操作易实现, 没有模糊不清, 没有自相矛盾
考勤机只是一个辅助手段, 不会有人天天早退还又回去补打考勤, 那样偶尔一次也许蒙混过关, 长期可能吗?
这种一天要 4 次考勤记录的方式很是纠结, 而且没有对人员班次的类型指定, 规则描述复杂繁琐, 很容易错漏矛盾
作者: fcxk 时间: 2015-11-27 07:27
回复 64# aa77dd@163.com
就按现在的,不会改了,第一次请您谅解下。
作者: fcxk 时间: 2015-11-27 07:31
回复 60# aa77dd@163.com
就按这个可以
作者: zyfsky 时间: 2015-11-27 16:58
本人不建议用脚本语言处理,这样大数据的运算,效率太慢了,我可以用VBS的老大,VB程序给你做
效率快N倍,需要VB的,可以联系本人QQ 251838045,
以下提供vbs(部分)代码。
dim a()
set obshell=wscript.createobject("wscript.shell")
xls=obshell.CurrentDirectory & "\源文件.xls"
Set VbExcel1 = CreateObject("Excel.Application") '创建excel对象
VbExcel1.Visible = False '对象不可见
VbExcel1.DisplayAlerts = False '关闭时不提示保存
VbExcel1.Workbooks.Open (xls)
VbExcel1.Sheets(1).Select
Set vbbook1 = VbExcel1
Trows1 = VbExcel1.ActiveSheet.UsedRange.Rows.Count 'Excel表格指定表的总列数带入变量 Trows
Tcols1 = VbExcel1.ActiveSheet.UsedRange.Columns.Count 'Excel表格指定表的总行数带入变量 Tcols
'msgbox trows1 & " " & tcols1
'以不同员工名定义数组元素
n=0
redim preserve a(n)
a(0)=vbbook1.cells(2,3).value
'循环表格每条数据与新数组的每个元素进行对比判断
for i = 3 to trows1
for j= 0 to ubound(a)
sb=true
'msgbox vbbook1.cells(i,3).value & "," & a(j)
if vbbook1.cells(i,3).value<>a(j) then
sb=true
else sb=fasle
exit for
end if
next
'若没发现新的数组里,有重名,就增加一人的姓名到新的数组里!
if sb=true then
n=n+1
redim preserve a(n)
a(n)=vbbook1.cells(i,3).value
msgbox n& " " &a(n)
end if
next
'循环列出分别每个人的相关打卡数据
for j= 0 to ubound(a)
msgbox a(j)
for i = 2 to trows1
if vbbook1.cells(i,3).value=a(j) then
ddate=year(vbbook1.cells(i,7).value) & "-" & month(vbbook1.cells(i,7).value) & "-" & day(vbbook1.cells(i,7).value)
msgbox a(j) & cdate(ddate) & GetWeek(cdate(ddate))
end if
next
next
'显示星期几的函数
Public Function GetWeek(ChkDate)
GetWeek = WeekdayName(Weekday(ChkDate)) '得知某天星期几
End Function
读取你的源xls
https://shop116026742.taobao.com/,专业程序接单!谢谢!
作者: yu2n 时间: 2015-11-28 14:16
本帖最后由 yu2n 于 2015-11-28 14:18 编辑
楼上,我也做了VBS版本的…-
- ' ' '
- strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
- "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 06:00:00") & "') And " & _
- "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 08:15:00") & "')"
- objRS2.Fields("上班1") = StringToDate(RunSQLReturnString(objConn1, strSQL))
-
- strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
- "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 11:11:00") & "') And " & _
- "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 12:30:00") & "')"
- objRS2.Fields("下班1") = StringToDate(RunSQLReturnString(objConn1, strSQL))
-
- strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
- "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 14:00:00") & "') And " & _
- "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 15:00:00") & "')"
- objRS2.Fields("上班2") = StringToDate(RunSQLReturnString(objConn1, strSQL))
-
- strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
- "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 16:10:00") & "') And " & _
- "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 18:10:00") & "')"
- objRS2.Fields("下班2") = StringToDate(RunSQLReturnString(objConn1, strSQL))
-
- strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
- "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 18:30:00") & "') And " & _
- "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 19:10:00") & "')"
- objRS2.Fields("上班3") = StringToDate(RunSQLReturnString(objConn1, strSQL))
-
- strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
- "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 21:00:00") & "') And " & _
- "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 22:00:00") & "')"
- objRS2.Fields("下班3") = StringToDate(RunSQLReturnString(objConn1, strSQL))
-
- ' ' '
复制代码
就想问问,现在还能领红包么…
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |