Board logo

标题: [已解决]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
  1. # & cls & gawk -f %0 %1 & pause & exit
  2. BEGIN{
  3. FS=",| "
  4. check[1][1]=600;check[1][2]=815;check[1][3]=1111;check[1][4]=1230
  5. check[2][1]=1400;check[2][2]=1500;check[2][3]=1610;check[2][4]=1810
  6. check[3][1]=1830;check[3][2]=1910;check[3][3]=2100;check[3][4]=2200
  7. }
  8. NR>1{
  9. sub(/:/,"",$8)
  10. arr[$3][$7]=arr[$3][$7]""$8" "
  11. }
  12. END{
  13. #统计数据
  14. asorti(arr,ta)
  15. for(id in ta){
  16. name=ta[id]
  17. for(day in arr[name]){
  18. split(arr[name][day],arrTime," ")
  19. for(x in check){
  20. earlierFlag=0;laterFlag=0
  21. for(y in arrTime){
  22. if(arrTime[y]>=check[x][1]&&arrTime[y]<=check[x][2]){earlierFlag=1;earlierTime=arrTime[y]}
  23. if(arrTime[y]>=check[x][3]&&arrTime[y]<=check[x][4]){laterFlag=1;laterTime=arrTime[y]}
  24. }
  25. #分类统计几种情况
  26. if(earlierFlag && laterFlag){
  27. sub(earlierTime,"",arr[name][day])
  28. sub(laterTime,"",arr[name][day])
  29. arr[name"-"day]=arr[name"-"day]" "earlierTime","laterTime",1,"
  30. sTmp="";arrTotal[name]++
  31. if(earlierTime>=1830){sTmp="1,"}else{sTmp=","}
  32. fday=gensub("/"," ","g",day)
  33. weekday=strftime("%A",mktime(fday" 0 0 0"))
  34. if((weekday=="星期二"||weekday=="星期四")&&earlierTime<=730){
  35. sTmp=sTmp"1,"
  36. }else{
  37. sTmp=sTmp","
  38. }
  39. if(weekday=="星期一"&&earlierTime<=720){sTmp=sTmp"1,"}else{sTmp=sTmp","}
  40. arr[name"-"day]=arr[name"-"day]""sTmp
  41. }
  42. }
  43. }
  44. }
  45. #打印处理
  46. print "姓名,打卡日期,星期,上班,下班,考勤段数,晚修段,早读,升旗,个人总段" >"result.csv"
  47. for(id in ta){
  48. name=ta[id]
  49. for(day in arr[name]){
  50. fday=gensub("/"," ","g",day)
  51. weekday=strftime("%A",mktime(fday" 0 0 0"))
  52. split(arr[name][day],arrTime," ")
  53. for(x in arrTime){
  54. if(!isFirst[name]++){
  55. tPrint=name","day","weekday","arrTime[x]",,,,,,"arrTotal[name]
  56. }else{
  57. tPrint=","day","weekday","arrTime[x]
  58. }
  59. sPrint=sPrint""tPrint"\n"
  60. }
  61. if(length(arr[name"-"day])){
  62. split(arr[name"-"day],arrRight," ")
  63. for(x in arrRight){
  64. if(!isFirst[name]++){
  65. tPrint=name","day","weekday","arrRight[x]""arrTotal[name]
  66. }else{
  67. tPrint=","day","weekday","arrRight[x]
  68. }
  69. sPrint=sPrint""tPrint"\n"
  70. }
  71. }
  72. }
  73. }
  74. #去掉最后一个换行符
  75. sPrint=substr(sPrint,1,length(sPrint)-1)
  76. split(sPrint,arrLine,"\n")
  77. #处理时间格式
  78. for(x in arrLine){
  79. split(arrLine[x],arrCol,",");arrLine[x]=""
  80. len=length(arrCol[4])
  81. arrCol[4]=substr(arrCol[4],1,len-2)":"substr(arrCol[4],len-1,2)
  82. if(len=length(arrCol[5])){
  83. arrCol[5]=substr(arrCol[5],1,len-2)":"substr(arrCol[5],len-1,2)
  84. }
  85. for(y in arrCol){arrLine[x]=arrLine[x]""arrCol[y]","}
  86. lines=lines""arrLine[x]"\n"
  87. }
  88. print lines >>"result.csv"
  89. }
复制代码
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.
楼主还是没有回答清楚这个问题:

这是楼主附件结果中的
  1.         2015-11-20        星期五        11:08               
  2.         2015-11-20        星期五        7:10        11:15        1
复制代码
我就这样理解了, 在 6 个打卡时间段外的打卡记录全作无效处理, 上面 11:08 在 11:11分-12:30分 时间段之前, 也不在任何其他打卡时间段内, 所以作无效记录处理, 和楼主的顶楼附件结果也是一致的
  1. 条件1:同一日期  上班:06:00分 - 08:15分、下班:11:11分-12:30分
  2. 条件2:同一日期  上班:14:00分 - 15:00分 、下班:16:10分 - 18:10分
  3. 条件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版本的…
  1. ' ' '
  2. strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
  3. "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 06:00:00") & "') And " & _
  4. "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 08:15:00") & "')"
  5. objRS2.Fields("上班1") = StringToDate(RunSQLReturnString(objConn1, strSQL))
  6. strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
  7. "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 11:11:00") & "') And " & _
  8. "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 12:30:00") & "')"
  9. objRS2.Fields("下班1") = StringToDate(RunSQLReturnString(objConn1, strSQL))
  10. strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
  11. "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 14:00:00") & "') And " & _
  12. "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 15:00:00") & "')"
  13. objRS2.Fields("上班2") = StringToDate(RunSQLReturnString(objConn1, strSQL))
  14. strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
  15. "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 16:10:00") & "') And " & _
  16. "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 18:10:00") & "')"
  17. objRS2.Fields("下班2") = StringToDate(RunSQLReturnString(objConn1, strSQL))
  18. strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
  19. "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 18:30:00") & "') And " & _
  20. "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 19:10:00") & "')"
  21. objRS2.Fields("上班3") = StringToDate(RunSQLReturnString(objConn1, strSQL))
  22. strSQL = "Select `打卡时间` From [" & GetFileNameEx(dbSource, "FN") & "] Where `姓名`='" & objRS2.Fields("姓名") & "' And " & _
  23. "`打卡时间`>=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 21:00:00") & "') And " & _
  24. "`打卡时间`<=CDate('" & StringToDate(objRS2.Fields("打卡日期") & " 22:00:00") & "')"
  25. objRS2.Fields("下班3") = StringToDate(RunSQLReturnString(objConn1, strSQL))
  26. ' ' '
复制代码
就想问问,现在还能领红包么…





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2