vba - 在vba中比较日期

标签 vba excel

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

最佳答案

您正在工作表上使用字符串文字值,这些值表示采用美国日期格式 (DD-MMM-YY) 的日期。这些不是日期值,它们只是字符串。因此,当您尝试像“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 
    ...

关于vba - 在vba中比较日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50395080/

相关文章:

vba - 根据单元格值创建查询表

vba - 如何在移动电子邮件时将 Outlook 电子邮件唯一标识为 MailItem.EntryID 更改

VBA简单地将一个范围复制到另一个范围

excel - 如何在 Excel VBA 中编写一个采用参数范围或列表的函数?

VBA AutoFilter 隐藏所有行 - 包括匹配条件的行

sql - 如何将表从 Microsoft SQL Server 导出到 Excel?

excel - 在 Excel 中导出和自定义 Crystal 报表

excel - VBA:如何在 Word 中开始和结束列表、项目符号或编号?

vba - 将 Range.Text 关联到 Range.Start 和 Range.End

arrays - 将参数数组传递给 CallByName VBA