我在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
答案 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
几乎相同,但是使用年份似乎更容易一些。