[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] [已解决]VBS实现Excel表格考勤数据统计合并。

1. 删除表格 (学校名称、编号、班级、主机编号、物理卡号)

2.合并相同姓名

3.增加(正常段、总正常段列)

4.统计段数: 日期相同时、07:30分之前记录  11:10分之后记录 相同日期两个条记录同时有为正常 1 次
                         14:30分之前记录  16:10分之后记录 相同日期两个条记录同时有为正常 1 次
                         19:10分之前记录  21:00分之后记录 相同日期两个条记录同时有为正常 1 次


5.总正常段:姓名正常段数总数。

6.晚修段数:19:10分之前记录  21:00分之后记录 的总正常段



结果为2表格效果
                       

在这先谢谢各位,很急用。。。。。
爱情不是一颗心去敲另一颗心、而是两颗心擦出火花。

相同日期是不是只能有一个正常段?

TOP

本帖最后由 fcxk 于 2015-11-21 09:44 编辑

回复 2# wankoilz

同一日期三个时间段:

07:30分之前(06:00到07:30)    11:10分之后(11:11到12:30) 为一个判断,两个时间要同时满足时才加1次正常,否则不处理
14:30分之前(13:00到14:30)   16:10分之后(16:10到18:00)为一个判断,两个时间要同时满足时才加1次正常,否则不处理
19:10分之前(18:30到19:10)   21:00分之后(21:00到22:00)为一个判断,两个时间要同时满足时才加1次正常,否则不处理

19:10分之前(18:30到19:10)   21:00分之后(21:00到22:00)这个段增加的正常1同时加到晚修总段数列

就是说:
07:30分之前 正常打了卡,但下班是11:00分,或下班时没有打卡、为不处理。要同时满足其中一组条件才行

07:30分之前正常打了卡,11:10分之后正常打了卡,则正常段加1

这个下班时间之后要在中午上班之前的时间段内:比如 11:10分之后(是11:11分到12:30分之前的段才行,因为14:30分又有一个上班时间段)
爱情不是一颗心去敲另一颗心、而是两颗心擦出火花。

TOP

标题

本帖最后由 wankoilz 于 2015-11-21 11:28 编辑

哦哦,刚才没仔细看,知道了
白天没时间,晚上用awk试试

TOP

标题

本帖最后由 wankoilz 于 2015-11-21 22:40 编辑

将excel文件导出为csv文件,然后用以下批处理脚本处理,可以统计得到一个半成品
将文件图标拖拽到脚本上执行,看看效果:
  1. # & cls & gawk -f %0 %1 & pause & exit
  2. BEGIN{
  3. FS=",| "
  4. check[1][1]=600;check[1][2]=730;check[1][3]=1110;check[1][4]=1230
  5. check[2][1]=1300;check[2][2]=1430;check[2][3]=1610;check[2][4]=1800
  6. check[3][1]=1830;check[3][2]=1910;check[3][3]=2100;check[3][4]=2200
  7. }
  8. {
  9. sub(/:/,"",$8)
  10. arr[$3" "$7]=arr[$3" "$7]""$8","
  11. }
  12. END{
  13. #将arr按姓名排序
  14. asorti(arr,ta)
  15. for(x in ta){
  16. gsub(","," ",arr[ta[x]])
  17. split(arr[ta[x]],arrTime," ")
  18. for(y in check){
  19. earlierFlag=0;laterFlag=0
  20. for(z in arrTime){
  21. if(arrTime[z]>=check[y][1]&&arrTime[z]<=check[y][2]){earlierFlag=1;earlierTime=arrTime[z]}
  22. if(arrTime[z]>=check[y][3]&&arrTime[z]<=check[y][4]){laterFlag=1;laterTime=arrTime[z]}
  23. }
  24. if(earlierFlag && laterFlag){
  25. sub(earlierTime,"",arr[ta[x]])
  26. sub(laterTime,"",arr[ta[x]])
  27. arr[ta[x]]=arr[ta[x]]" "earlierTime"-"laterTime
  28. }
  29. }
  30. }
  31. print "姓名,日期,开始时间,结束时间,标记" >>"result.csv"
  32. for(x in ta){
  33. split(arr[ta[x]],arrValue," ")
  34. for(y in arrValue){
  35. split(arrValue[y],arrTmp,"-")
  36. formatTime=""
  37. for(z in arrTmp){
  38. len=length(arrTmp[z])
  39. formatTime=formatTime","substr(arrTmp[z],1,len-2)":"substr(arrTmp[z],len-1,2)
  40. }
  41. if(length(formatTime)>6){formatTime=formatTime",1"}
  42. sub(" ",",",ta[x])
  43. print ta[x]""formatTime >>"result.csv"
  44. }
  45. }
  46. }
复制代码
gawk 4.1.0 下载地址:http://www.bathome.net/viewthread.php?tid=21366&highlight=gawk
1

评分人数

    • fcxk: 能不能直接处理表格文件,保留第一行标题行技术 + 1

TOP

回复 5# wankoilz


    显示错误。缺少语句
爱情不是一颗心去敲另一颗心、而是两颗心擦出火花。

TOP

有没有下载gawk?把gawk.exe和批处理放在一起。

TOP

本帖最后由 fcxk 于 2015-11-21 21:17 编辑

回复 7# wankoilz


    下了,好相结果好乱,看不出结果,能用excel吗,与源文件2这样效果
爱情不是一颗心去敲另一颗心、而是两颗心擦出火花。

TOP

回复 8# fcxk

不是直接双击执行,是通过拖拽图标执行的吧?

TOP

回复 9# wankoilz


        是拖放,按你说的,没有按条件判断加正常1
   姓名没有合并
爱情不是一颗心去敲另一颗心、而是两颗心擦出火花。

TOP

5楼代码更新了,但是单元格合并这个目前没办法,剩下的只需要用vbs调整一下格式
vbs操作excel我不熟悉

TOP

回复 11# wankoilz


    可以,表格第一行能不能不要删除
    要是直接可以处理excel就更好了,太感谢
爱情不是一颗心去敲另一颗心、而是两颗心擦出火花。

TOP

本帖最后由 wankoilz 于 2015-11-21 22:42 编辑

已添加表头
gawk.exe没办法直接处理excel文件
1

评分人数

TOP

回复 13# wankoilz


    晚修段好像不会另外一列分开增加1
爱情不是一颗心去敲另一颗心、而是两颗心擦出火花。

TOP

返回列表