Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-工作日和/或日期差异函数工作不正常_Vba_Excel - Fatal编程技术网

Excel VBA-工作日和/或日期差异函数工作不正常

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

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

正如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或更早的值更新单元格的颜色,对吗?