Excel VBA – 平日和/或datefunction无法正常工作

我有下面的代码应该parsing一个列的date/时间,并build议(通过突出显示)如果值是在24小时前,截至当天上午6时30分。 如果星期一是星期一,则应该回顾72小时(因为星期六和星期日不是工作日),并build议截至上午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 

正如其他人所说,你需要testingWeekday ,因为它不返回一个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 

用这种方式编写,使维护起来更容易

正如Kostas K.在评论中提到的那样, Weekday()返回一个从1到7的Integer ,总是被评估为True布尔值 – MSDN Weekday !

然而,如果你使用If Weekday(Date, vbMonday) = vbMonday如果今天是星期一,你很可能会得到一个False

那是因为平日开始的默认date是星期日。 你正在改变星期一。 而相反, vbMonday总是被评估为2 (在即时窗口写入?vbMonday

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

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