为什么我的 IsDate() If 语句忽略“31/12/1019”

Emb*_*bie 1 excel vba

我试图删除特定时间段之前的所有日期,以及数据集中不是日期的任何内容。A 列中大约有 4000 个条目,可追溯到过去 10 年,其中混杂着一些拼写错误。数据之间没有空白点。

我拼凑了下面的代码,几乎可以工作。然而,有一个条目31/12/1019没有被认为是旧日期或拼写错误。

Sub deleterows()
    lastRow = Sheets("ConData").Cells(Rows.Count, 1).End(xlUp).Row
    bankingDate = DateSerial(Year(Date), Month(Date), 0)

    For i = lastRow To 1 Step -1
        If IsDate(Cells(i, 1)) = False Or _
           Cells(i, 1).Value <= bankingDate Then Rows(i).EntireRow.Delete
    Next
End Sub
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

Sco*_*ner 5

让我们分解一下,这是 Excel 和 VBA 之间的一个奇妙的不一致:

根据这篇文章:

在Windows中,有效日期的范围是公元100年1月1日到公元9999年12月31日;范围因操作系统而异。

所以 IsDate 将返回 TRUE31/12/1019

由于 Excel 实际上将“日期”存储为双精度型,因此1900-01-01日期1.00将作为字符串存储在工作表中,并且Cells(i, 1).Value <= bankingDate会返回False,因为字符串大于数字。

但正如@BigBen 所说:

在与 进行比较之前先转换为日期bankingDate

If Not IsDate(Cells(i, 1).Value) Then
   Rows(i).EntireRow.Delete
ElseIf CDate(Cells(i, 1).Value) <= bankingDate
   Rows(i).EntireRow.Delete
End If
Run Code Online (Sandbox Code Playgroud)