基于VBA中的日期值识别天数

基于VBA中的日期值识别天数,vba,excel,Vba,Excel,我在K栏中有日期和时间,在M栏中有与这些天相对应的某些值(数字) 我有一个代码,如果这些值大于1,并且在列p中有一个文本“waiting”,则会更改这些值的颜色 我不知道要做的是,将以下条件添加到此代码中: 1.我想确定这些天是否属于星期天 2.如果是,那么我想检查是否从M列中的数字中减去星期日小时数(假设日期/时间格式为“15/1/2016 17:00”,因此星期日剩余时间为0.3天),如果数字仍然大于1,则应以“红色”突出显示 3.减法不应影响或出现在当前工作表中 我尝试了下面的代码,但我不

我在K栏中有日期和时间,在M栏中有与这些天相对应的某些值(数字)

我有一个代码,如果这些值大于1,并且在列p中有一个文本“waiting”,则会更改这些值的颜色

我不知道要做的是,将以下条件添加到此代码中:

1.我想确定这些天是否属于星期天

2.如果是,那么我想检查是否从M列中的数字中减去星期日小时数(假设日期/时间格式为“15/1/2016 17:00”,因此星期日剩余时间为0.3天),如果数字仍然大于1,则应以“红色”突出显示

3.减法不应影响或出现在当前工作表中

我尝试了下面的代码,但我不确定我在哪里犯了错误,因为没有结果

Sub Datefilter()
Dim r As Long
Dim m As Long

On Error GoTo ExitHere:
m = Range("M:P").Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Application.ScreenUpdating = False
   For r = 1 To m
      remainingDay = 0

       If Weekday(Range("K" & r)) = 1 Then

              remainingDay = Round((24 - Format(TimeValue(Range("K" & r)), "h")) / 24, 1)

               End If
      If Range("P" & r) = "*waiting*" Then
            If Range("M" & r) - remainingDay >= 1 Then
                  Range("M" & r).Cells.Font.ColorIndex = 3
                  Else
                 Range("M" & r).Cells.Font.ColorIndex = 0
               End If
               End If
      Next r
      ExitHere:
      Application.ScreenUpdating = True
End Sub

我觉得使用Excel的内置函数和一些帮助器列会容易得多

(1) 使用
WEEKDAY()
函数获取一周中的某一天。然后用一个简单的比较来检查是否是星期天

(2) 日期存储为自1900年1月0日起过期的时间量,部分日期为分数。因此,要返回时间,只需从日期中获取日期的舍入位:
=A1-ROUNDDOWN(A1,0)

(3) 使用条件格式检查单元格是否小于1,然后将其变为红色

如果你想要一个例子的截图,请告诉我

试试这个:

Sub Datefilter()

Dim r, lastrow, remainingDay As Long

'On Error GoTo ExitHere: ' I recommend to delete this

lastrow = Range("M:P").Cells(Rows.Count, "A").End(xlUp).Row

Application.ScreenUpdating = False

   For r = 1 To lastrow
      remainingDay = 0

        If Weekday(Range("K" & r).Value, vbSunday) = 1 Then
                remainingDay = Round((24 - Format(TimeValue(Range("K" & r)), "h")) / 24, 1)

             If InStr(1, Range("P" & r).Text, "waiting", vbTextCompare) > 0 Then

                 If Range("M" & r) - remainingDay >= 1 Then
                     Range("M" & r).Cells.Font.ColorIndex = 3
                 Else
                     Range("M" & r).Cells.Font.ColorIndex = 0
                 End If
             End If
        End If
    Next r
'ExitHere: ' I recommend to delete this
      Application.ScreenUpdating = True
End Sub

感谢您的洞察力。但我需要完成的是VBA代码:(好的,但为什么必须是VBA?在Excel中它会更快更简单。而且您可以获得所有好处,例如能够使用撤销、查看计算步骤等。请尝试在代码中使用
工作日
WhatDayisIt=weekday(“2017年1月15日,vbMonday”)
。它会告诉您现在是哪一天(我在第7种情况下将星期一设置为一周中的第一天)。此代码是VBA较大代码的一部分,因此我正在尝试为此创建一个VBA代码。我已使用修改过的代码编辑了OP。但这仍然不起作用作为较大代码的一部分也没关系…但我仍然会使用Excel。我已查看了您的个人资料和您询问的有关单元格着色的其他问题,我将类似地使用Excel。这让我怀疑你的整个解决方案必须使用VBA!说真的,Excel更好-你可以使用撤销,它会自动更新,它会处理你插入的列,它会告诉你计算步骤,你不需要启用宏…试着注释掉
上的错误转到ExitHere
,看看它是否显示任何错误t在
中显示类型不匹配错误,如果工作日(范围(“K”&r))=1,则
类型不匹配时
范围(“K”&r)
的内容是什么?Excel可能无法将其转换为
日期
。请尝试具体获取
属性->
范围(“K”&r).Value
并查看它是否有效我在哪里包括
范围(“K”和r).Value
在代码中?我将r=1的
更改为m
为r=2的
更改为m
,因为值从第2行开始,类型不匹配错误不再出现..但结果也不会出现..更改后,我尝试立即窗口并键入您所说的内容,得到的错误为
运行时错误1004-应用程序定义或object定义的错误
如果工作日(范围(“K”&r).Value,vbSunday)=1,则
列“K”中有哪些数据?它应该是OP规定的日期/时间。
工作日
应使用此类输入并返回一个数字。这些是“MM/DD/YYY时间”中的日期格式,示例-1/15/2016 21:16我已使用这些输入检查了此代码:“1/22/2017 21:16”(星期日),“1/15/2016 21:16”(星期五),它正确识别了日期。。