Excel VBA-工作日和/或日期差异函数工作不正常
我有下面的代码,它应该解析一个带有日期/时间的列,并(通过突出显示)建议该值是否早于24小时前(截至当天上午6:30)。如果一天是星期一,则应回顾72小时(因为星期六和星期日不是工作日),并告知该值是否早于上午6:30的72小时 有点不对劲,因为它没有突出显示超过24小时阈值的值,但我不知道是什么Excel VBA-工作日和/或日期差异函数工作不正常,vba,excel,Vba,Excel,我有下面的代码,它应该解析一个带有日期/时间的列,并(通过突出显示)建议该值是否早于24小时前(截至当天上午6:30)。如果一天是星期一,则应回顾72小时(因为星期六和星期日不是工作日),并告知该值是否早于上午6:30的72小时 有点不对劲,因为它没有突出显示超过24小时阈值的值,但我不知道是什么 'Highlight breached tickets Dim updateRange As Range, updateCell As Range Set updateRange = Range("D
'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
正如Kostas K.在评论中所提到的,
Weekday()
返回一个从1到7的整数
数值,该数值总是计算为True
boolean-
但是,如果使用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
正如其他人所说,您需要针对某个对象测试
工作日
,因为它不会返回布尔值。但是,我想我会添加这个,因为您可以重新编写代码,这样您就不会重复自己的操作,因为几乎所有的操作都是完全相同的
'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
Weekday()
函数返回一个变量(整数),而不是布尔值。您需要提供一个比较值<代码>如果工作日(日期,vbMonday)=vbMonday,那么…
啊,是的。修复了itI试图编辑此代码以在星期二添加一个代码段(如果脚本在星期二运行,因为星期一没有工作,则使用此代码段)。我认为这就像将变量从TimeDiff更改为其他变量一样简单,将vbMonday更改为vbtuday,并将1,72,40更改为1,96,40。我错了,因为它不起作用,我不能让它起作用。我遗漏了什么?@sbagnato请看一下我答案的更新。因此,如果我在周一早上运行此程序,则案例1将根据早上6:30的时间,突出显示72小时及以上的单元格。那么在第二种情况下,时间差是96吗?如果你想从周一、周日和周六得到所有的东西,那么一周剩下的日子都要做ect。抱歉,在我的示例中使用了一个随机数,用于周二无需担心。在进行更改之前,为了确保我的理解是正确的,因为它被设置为更新单元格颜色,它会用72:01或更早的值更新单元格的颜色,对吗?