Excel VBA - 工作日和/或datediff函数无法正常工作

时间:2017-12-08 12:30:40

标签: excel vba excel-vba

我有下面的代码,它应该用日期/时间解析一个列,并建议(通过突出显示)该值是否超过24小时前的当天早上6:30。如果当天是星期一,则应该回顾72小时(因为星期六和星期日不是工作日),并建议从早上6:30开始,该值是否超过72小时。

有些东西不对,因为它没有突出显示违反24小时门槛的价值,但我不知道它是什么。

'Highlight breached tickets
Dim updateRange As Range, updateCell As Range
Set updateRange = Range("D2:D" & lastRow)
If Weekday(Date, vbMonday) Then
    For Each updateCell In updateRange
        If DateDiff("h", CDate(updateCell.Value), CDate(Format(Now(), "mm/dd/yy")) + TimeSerial(6, 30, 0)) > 72 Then
            updateCell.Interior.Color = 13311
            updateCell.Offset(0, -3).Interior.Color = 13311
        End If
    Next updateCell
Else
    For Each updateCell In updateRange
        If DateDiff("h", CDate(updateCell.Value), CDate(Format(Now(), "mm/dd/yy")) + TimeSerial(6, 30, 0)) > 24 Then
            updateCell.Interior.Color = 13311
            updateCell.Offset(0, -3).Interior.Color = 13311
        End If
    Next updateCell
End If

2 个答案:

答案 0 :(得分:2)

正如其他人所说,您需要针对某些内容测试repeat_interval => 'FREQ=WEEKLY; BYDAY=FRI; BYHOUR=3' ,因为它不会返回Weekday值。但是,我想我会添加这个,因为你可以重新编写代码,所以你不要重复自己,因为几乎所有的代码都是完全相同的

Boolean

以这种方式编写使维护更容易

评论后更新 要修改它以应对其他日子,最简单(也是最容易阅读)的方法是更改​​'Highlight breached tickets Dim updateRange As Range, updateCell As Range Dim TimeDiff As Long Set updateRange = Range("D2:D" & Lastrow) TimeDiff = IIf(Weekday(Date, vbMonday) = 1, 72, 40) For Each updateCell In updateRange If DateDiff("h", CDate(updateCell.Value), CDate(Format(Now(), "mm/dd/yy")) + TimeSerial(6, 30, 0)) > TimeDiff Then updateCell.Interior.Color = 13311 updateCell.Offset(0, -3).Interior.Color = 13311 End If Next updateCell 行并使用TimeDiff =语句设置值

Select Case

答案 1 :(得分:1)

正如Kostas K.在评论中所提到的,Weekday()会返回1到7之间的Integer个数字,并且总是会计算为True布尔值 - MSDN Weekday

但是,如果您最有可能使用If Weekday(Date, vbMonday) = vbMonday,那么如果今天是星期一,您将获得False

这是因为工作日开始的默认日是星期日。而你正在改变它到星期一。相反,vbMonday总是被评估为2(在即时窗口写?vbMonday

无论如何,看起来要比解释它容易一些。今天是星期五(TGIF)。因此,只需运行以下代码:

Public Sub TestMe()
    Debug.Print Weekday(Date) = vbFriday            'True
    Debug.Print Weekday(Date, vbMonday) = vbFriday  'False
End Sub