ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: tengyt

[求助] 老师帮忙看看代码,判断出来时间前后都差1分钟

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-7-4 13:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 一把小刀闯天下 于 2018-7-4 13:25 编辑
tengyt 发表于 2018-7-4 12:43
上面代码在上表运行很好,谢谢老师

我插入两列后,你帮我写的代码不能运行了,我还做了列调整
'规则是否有问题,跟你的示例结果相差很多。

'代码按你规则来写的看不出有什么毛病,自己好好确认一下。

Option Explicit

Sub test()
  Dim mark, i, t, arr, a, b
  arr = Range("l2:o2" & Cells(Rows.Count, "l").End(xlUp).Row)
  mark = "一二三四五六日"
  For i = 1 To UBound(arr, 1)
    If arr(i, 1) = #12:00:00 AM# Then
      arr(i, 1) = "无考勤记录"
    Else
      t = InStr(mark, Right(arr(i, 3), 1))
      Select Case t
      Case 1: a = #9:00:00 AM#: b = #10:00:00 AM#
      Case 2 To 4, 6, 7
        If arr(i, 4) = "上午" Then
          a = #9:00:00 AM#: b = #10:00:00 AM#
        Else
          a = #2:30:00 PM#: b = #3:30:00 PM#
        End If
      Case 5: a = #3:30:00 PM#: b = #5:00:00 PM#
      End Select
      arr(i, 1) = IIf(CDate(arr(i, 1)) >= a And CDate(arr(i, 1)) <= b, "按时", "未按时")
    End If
  Next
  [s2].Resize(UBound(arr, 1)) = arr  '把s2 改成m2就可以,这里做比较用
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-4 18:49 | 显示全部楼层
一把小刀闯天下 发表于 2018-7-4 13:23
'规则是否有问题,跟你的示例结果相差很多。

'代码按你规则来写的看不出有什么毛病,自己好好确认一下。 ...

老师,辛苦了,谢谢你了
运行很好,就是底下会多出很多“无考勤记录”,删除起来麻烦
还想增加一个,例如临时决定“2015/3/3”、“2015/3/11”只要签到时间“06:00:00--18:00:00”有签到,都算“按时”,能不能再帮忙预留两行代码,以便以后方便随时添加使用,再次感谢老师,老师,您辛苦了

无标题.jpg

12333.rar

14.93 KB, 下载次数: 2

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-5 08:07 | 显示全部楼层
本帖最后由 tengyt 于 2018-7-5 08:08 编辑
一把小刀闯天下 发表于 2018-7-4 13:23
'规则是否有问题,跟你的示例结果相差很多。

'代码按你规则来写的看不出有什么毛病,自己好好确认一下。 ...

老师,辛苦了,谢谢你了
运行很好,就是底下会多出很多“无考勤记录”,删除起来麻烦
还想增加一个,例如临时决定“2015/3/3”、“2015/3/11”只要签到时间“06:00:00--18:00:00”有签到,都算“按时”,能不能再帮忙预留两行代码,以便以后方便随时添加使用,再次感谢老师,老师,您辛苦了

无标题.jpg

12333.rar

14.93 KB, 下载次数: 0

TA的精华主题

TA的得分主题

发表于 2018-7-5 08:30 | 显示全部楼层
tengyt 发表于 2018-7-4 18:49
老师,辛苦了,谢谢你了
运行很好,就是底下会多出很多“无考勤记录”,删除起来麻烦
还想增加一个,例 ...

'可在[q2]、[q3]分别写入2015/3/3、2015/3/11 (就是例外处理,个数不限但为连续单元格)

'"多出很多",是你工作表的问题。已加条件避免出现这情况

Option Explicit

Sub test()
  Dim mark, i, t, arr, a, b, dic
  Set dic = CreateObject("scripting.dictionary")
  If IsDate([q2]) Then '例外:[q2]开始,向下连续,行数不限
    For i = 2 To Cells(Rows.Count, "q").End(xlUp).Row
     If Not IsDate(Cells(i, "q")) Then Exit For
     dic(CStr(Cells(i, "q"))) = vbNullString
    Next
  End If
  arr = Range("k2:o2" & Cells(Rows.Count, "b").End(xlUp).Row)
  mark = "一二三四五六日"
  For i = 1 To UBound(arr, 1)
    If dic.exists(CStr(arr(i, 1))) Then '例外处理
      arr(i, 1) = IIf(CDate(arr(i, 2)) >= #6:00:00 AM# _
        And CDate(arr(i, 2)) <= #6:00:00 PM#, "按时", "未按时")
    Else
      If arr(i, 2) = #12:00:00 AM# Then
        If Len(arr(i, 2)) > 0 Then arr(i, 1) = "无考勤记录"
      Else
        t = InStr(mark, Right(arr(i, 4), 1))
        Select Case t
        Case 1: a = #9:00:00 AM#: b = #10:00:00 AM#
        Case 2 To 4, 6, 7
          If arr(i, 5) = "上午" Then
            a = #9:00:00 AM#: b = #10:00:00 AM#
          Else
            a = #2:30:00 PM#: b = #3:30:00 PM#
          End If
        Case 5: a = #3:30:00 PM#: b = #5:00:00 PM#
        End Select
        arr(i, 1) = IIf(CDate(arr(i, 2)) >= a And _
          CDate(arr(i, 2)) <= b, "按时", "未按时")
      End If
    End If
  Next
  [m2].Resize(UBound(arr, 1)) = arr
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-5 09:31 | 显示全部楼层
一把小刀闯天下 发表于 2018-7-5 08:30
'可在[q2]、[q3]分别写入2015/3/3、2015/3/11 (就是例外处理,个数不限但为连续单元格)

'"多出很多", ...

太完美了,太强大了,辛苦了老师,谢谢你了,稍后一定评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-5 16:48 | 显示全部楼层
一把小刀闯天下 发表于 2018-7-5 08:30
'可在[q2]、[q3]分别写入2015/3/3、2015/3/11 (就是例外处理,个数不限但为连续单元格)

'"多出很多", ...

老师再帮忙写个,表格都一样一天签4次,周一到周日都是以下时间
8:00-8:10    11:20-11:30    14:00-14:10    17:00-17:30

上面代码再帮忙改改,辛苦老师了,万分感谢

TA的精华主题

TA的得分主题

发表于 2018-7-5 19:23 | 显示全部楼层
tengyt 发表于 2018-7-5 16:48
老师再帮忙写个,表格都一样一天签4次,周一到周日都是以下时间
8:00-8:10    11:20-11:30    14:00-14: ...

'按12楼的附件瞎掰的,因为条件太少也没有示例,先写个

'可以再上个附件然后做些简要说明,当然最好得有示例图

Option Explicit

Sub test()
  Dim arr, tm, i, j
  arr = Range("k2:o2" & Cells(Rows.Count, "b").End(xlUp).Row)
  tm = Array(#8:00:00 AM#, #8:10:00 AM#, #11:20:00 AM#, #11:30:00 AM#, # _
    2:00:00 PM#, #2:10:00 PM#, #5:00:00 PM#, #5:30:00 PM#)
  For i = 1 To UBound(arr, 1)
    If Len(arr(i, 2)) = 0 Then Exit For
    For j = 0 To UBound(tm) Step 2
      If CDate(arr(i, 2)) >= tm(j) And CDate(arr(i, 2)) <= tm(j + 1) Then Exit For
    Next
    arr(i, 1) = IIf(j = UBound(tm) + 1, "异常", "按时")
  Next
  [m2].Resize(UBound(arr, 1)) = arr
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-5 21:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 tengyt 于 2018-7-6 02:28 编辑

压缩文件里面讲的较详细

老师,先谢谢了,帮忙再写写代码
1.行政人员签到增加“00:00:00”显示“无考勤记录”
2.行政人员签到增加,例如临时决定“2015-03-03”、“2015-03-12”只要签到时间范围“06:00:00--18:00:00”有签到,都算“按时”,帮忙预留写两行代码,以便以后方便随时添加使用,再次感谢老师

888888.rar

24.75 KB, 下载次数: 0

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-5 21:14 | 显示全部楼层
本帖最后由 tengyt 于 2018-7-6 02:28 编辑
一把小刀闯天下 发表于 2018-7-5 19:23
'按12楼的附件瞎掰的,因为条件太少也没有示例,先写个

'可以再上个附件然后做些简要说明,当然最好得 ...

压缩文件里面讲的较详细

老师,先谢谢了,帮忙再写写代码
1.行政人员签到增加“00:00:00”显示“无考勤记录”
2.行政人员签到增加,例如临时决定“2015-03-03”、“2015-03-12”只要签到时间范围“06:00:00--18:00:00”有签到,都算“按时”,帮忙预留写两行代码,以便以后方便随时添加使用,再次感谢老师

888888.rar

24.75 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2018-7-6 10:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
tengyt 发表于 2018-7-5 21:14
压缩文件里面讲的较详细

老师,先谢谢了,帮忙再写写代码

'拼在一起了,应该差不多,自己好好测试一下

Option Explicit

Sub 行政人员签到()
  Dim arr, tm, i, j, dic
  Set dic = CreateObject("scripting.dictionary")
  If IsDate([v2]) Then '例外条件
    For i = 2 To Cells(Rows.Count, "v").End(xlUp).Row
     If Not IsDate(Cells(i, "v")) Then Exit For
     dic(CStr(Cells(i, "v"))) = vbNullString
    Next
  End If
  arr = Range("k2:o2" & Cells(Rows.Count, "b").End(xlUp).Row)
  tm = Array(#8:00:00 AM#, #8:10:00 AM#, #11:20:00 AM#, #11:30:00 AM# _
    , #2:00:00 PM#, #2:10:00 PM#, #5:00:00 PM#, #5:30:00 PM#)
  For i = 1 To UBound(arr, 1)
    If dic.exists(CStr(arr(i, 1))) Then '例外处理
      arr(i, 1) = IIf(CDate(arr(i, 2)) >= #6:00:00 AM# And _
        CDate(arr(i, 2)) <= #6:00:00 PM#, "按时", "无考勤记录")
    Else
      If arr(i, 2) = #12:00:00 AM# Then '处理#00:00:00#
        If Len(arr(i, 2)) > 0 Then arr(i, 1) = "无考勤记录"
      Else
        For j = 0 To UBound(tm) Step 2
          If CDate(arr(i, 2)) >= tm(j) And CDate(arr(i, 2)) <= tm(j + 1) Then Exit For
        Next
        arr(i, 1) = IIf(j = UBound(tm) + 1, "异常", "按时")
      End If
    End If
  Next
  [m2].Resize(UBound(arr, 1)) = arr
End Sub

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-4 12:45 , Processed in 0.039954 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表