与VBA比较日期

时间:2017-06-28 08:48:47

标签: excel vba excel-vba

我正在比较W栏和AA栏中的两个日期。 情况是如果列AA> W,那么应该打印Nok。 如果列AA <= W,那么它应该打印OK。

我的代码正常运行。但问题等于条件不满足。

例如,我在W和AA栏中有一个日期01.09.2017,根据公式它应该是OK,但它打印NOK。

有谁能告诉我,病情有什么问题。我希望它能在VBA中完成。

Sub Compare1()

    Dim i               As Long
    Dim lngLastRow      As Long
    Dim ws              As Worksheet            

    Set ws = Sheets("BW")    
    With ws            
        For i = 2 To 591
            If .Cells(i, 27).Value = "" Then            
                .Cells(i, 28).Value = "N/A"
            Else            
                If .Cells(i, 27).Value <= .Cells(i, 23).Value Then            
                    .Cells(i, 28).Value = "OK"
                    .Cells(i, 28).Interior.Color = RGB(0, 255, 0)            
                Else                
                    .Cells(i, 28).Value = "NOK"              
                    .Cells(i, 28).Interior.Color = RGB(255, 0, 0)
                End If            
            End If                
        Next i
    End With

End Sub

3 个答案:

答案 0 :(得分:2)

您可以使用DateDiff功能获取2个日期之间的差异。

当把&#34; d&#34;作为第一个参数,您要检查以天为单位的增量,因此如果两个日期相同,只是小时数不同,结果仍为0

要详细了解DateDiff功能,请转到MSDN

代码

Sub Compare1()

    Dim i               As Long
    Dim lngLastRow      As Long
    Dim ws              As Worksheet
    Dim DeltaDays       As Long

    Set ws = Sheets("BW")
    With ws
        For i = 2 To 591
            If .Cells(i, 27).Value = "" Then
                .Cells(i, 28).Value = "N/A"
            Else
                DeltaDays = DateDiff("d", .Cells(i, 27).Value, .Cells(i, 23).Value)
                If DeltaDays <= 0 Then
                    .Cells(i, 28).Value = "OK"
                    .Cells(i, 28).Interior.Color = RGB(0, 255, 0)
                Else
                    .Cells(i, 28).Value = "NOK"
                    .Cells(i, 28).Interior.Color = RGB(255, 0, 0)
                End If
            End If
        Next i
    End With

End Sub

答案 1 :(得分:1)

这样的事情应该为你做,你的问题,如评论状态,是你可能在你的日期传递时间,Format功能将允许你删除它们,On Error Resume Next的原因{ {1}}如果单元格值为空,则会出现错误13 - Type Mismatch

Sub Compare1()

    Dim i As Long, lngLastRow As Long
    Dim ws As Worksheet
    Dim FirstDate As Date, SecondDate As Date

    Set ws = Sheets("BW")

    With ws

        For i = 2 To 591

            On Error Resume Next
            FirstDate = Format(.Cells(i, "AA").Value, "dd/mm/yyyy")
            SecondDate = Format(.Cells(i, "W").Value, "dd/mm/yyyy")
            On Error GoTo 0

            If FirstDate = Empty Then
                .Cells(i, 28).Value = "N/A"
            Else
                If FirstDate <= SecondDate Then
                    .Cells(i, "AB").Value = "OK"
                    .Cells(i, "AB").Interior.Color = RGB(0, 255, 0)
                Else
                    .Cells(i, "AB").Value = "NOK"
                    .Cells(i, "AB").Interior.Color = RGB(255, 0, 0)
                End If
            End If

        Next i

    End With

End Sub

您也可以使用下面而不是If声明,我个人认为这是简单而干净但这是个人偏好

Select Case FirstDate
    Case Is = ""
        .Cells(i, "AB").Value = "N/A"
    Case Is <= SecondDate
        .Cells(i, "AB").Value = "OK"
        .Cells(i, "AB").Interior.Color = RGB(0, 255, 0)
    Case Is > SecondDate
        .Cells(i, "AB").Value = "NOK"
        .Cells(i, "AB").Interior.Color = RGB(255, 0, 0)
End Select

答案 2 :(得分:0)

如果您的列W和AA包含的日期,则最简单的解决方法是通过获取日期/时间值的整数部分来删除这些时间。

所以你可以使用:

If Int(.Cells(i, 27).Value) <= Int(.Cells(i, 23).Value) Then

请注意,这将决定2017年6月28日上午10:00的日期/时间是否小于或等于同一天的早上7:00,这听起来就像你想要的那样做 - 但它确实提出了为什么时间在细胞中的问题,如果它们无论如何都会被忽略。