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

问题描述 投票:1回答:2

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

正如其他人所说,你需要针对某些东西测试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

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
© www.soinside.com 2019 - 2024. All rights reserved.