在vba中比较日期

时间:2018-05-17 15:20:57

标签: excel vba excel-vba

enter image description here

我在excel中比较日期时遇到问题。从工作表中提取一个日期值,其格式为" 24-JAN-17"。其他数据在" 2017-12-31"的脚本中声明。有没有人知道比较这两个日期的解决方案,所以我可以确定从工作表中提取的日期值是否晚于2018年。我已将代码包含在下面的当前状态中。

Sub removeWrongYear()

Dim i As Long, yearA As Long, rowsCnt As Long
Dim rowsToDelete As Range
Dim vData As Variant

yearA = 2017

With ActiveSheet

    '1st to 635475 row, 20th column
    vData = Range(.Cells(1, 20), .Cells(635475, 20))

    For i = UBound(vData) To 2 Step -1
        If vData(i, 1) > DateSerial(yearA, 12, 31) Then
            rowsCnt = rowsCnt + 1

            If rowsCnt > 1 Then
                Set rowsToDelete = Union(rowsToDelete, .Rows(i))
            ElseIf rowsCnt = 1 Then
                Set rowsToDelete = .Rows(i)
            End If

        End If
    Next i

End With

If rowsCnt > 0 Then
    Application.ScreenUpdating = False
    rowsToDelete.EntireRow.Delete
    Application.ScreenUpdating = True
End If

End Sub

2 个答案:

答案 0 :(得分:1)

您正在使用工作表上的字符串文字值,它们表示美国日期格式(DD-MMM-YY)的日期。这些不是Date,它们只是字符串。因此,当您尝试像“22-JAN-18”这样的字符串进行解析时,例如使用Year函数,我的理解是它应该返回“2018”。但是使用不同的语言环境设置可能会很棘手,而且由于VBA(尽管是语言环境设置)总是(?)以美国格式解释日期,这很复杂。

你能测试一下吗?

Sub test()

    Dim s as String
    s = "22-JAN-18"
    Debug.Print Year(s)

End Sub

如果这不起作用,请尝试:

Debug.Print Year(Format(s, "DD-MMM-YY"))

这可能有用,因为您明确指定了类似日期的字符串的格式

如果有效,请尝试:

Dim theDate as Date
theDate = DateValue(Format(vData(i, 1), "DD-MMM-YY"))

If Year(theDate) > yearA Then 
    ...

答案 1 :(得分:0)

从工作表中提取一个日期值,其格式为" 24-JAN-17"。其他数据在" 2017-12-31"的脚本中声明。

要比较两个变量,最好的方法是确保它们属于同一类型。因此,尝试将它们解析为日期。然后比较:

Public Sub TestMe()

    Dim dt1 As Date: dt1 = "24-JAN-17"
    Dim dt2 As Date: dt2 = "2017-12-31"

    Debug.Print Year(dt1) < 2017
    Debug.Print Year(dt1)

End Sub

在您的代码中,> DateSerial(2016, 12, 31)Year(dt1) < 2017几乎相同,但是使用年份似乎更容易一些。