我有下面的代码,它应该用日期/时间解析一个列,并建议(通过突出显示)该值是否超过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
答案 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