我有下面的代码应该用日期/时间解析一列,并建议(通过突出显示)该值是否超过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
正如其他人所说,你需要针对某些东西测试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
语句设置值
'Highlight breached tickets
Dim updateRange As Range, updateCell As Range
Dim TimeDiff As Long
Set updateRange = Range("D2:D" & Lastrow)
Select Case Weekday(Date, vbMonday)
' Monday
Case 1
TimeDiff = 72
' Tuesday
Case 2
TimeDiff = 96
' Any other day
Case Else
TimeDiff = 40
End Select
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
。
这是因为工作日开始的默认日是星期日。而你正在改变它到星期一。而相反,vbMonday
总是被评估为2
(在即时窗口写?vbMonday
)
无论如何,看到它可能比解释它要容易一些。今天是星期五(TGIF)。因此,只需运行以下代码:
Public Sub TestMe()
Debug.Print Weekday(Date) = vbFriday 'True
Debug.Print Weekday(Date, vbMonday) = vbFriday 'False
End Sub