我使用VBA DateSerial函数来分隔string中的date,但是当string中的年份为“1000”时,Excel Ends Sub。 我究竟做错了什么?

我正在使用VBA DateSerial函数来分隔string中的date,并将它们填充到另一个工作表上,但是当string中的年份是“1000”时,Excel Ends Sub。

这里是一个例子:

string data: 2012-01-012012-03-01 2013-01-012013-03-01 1000-01-011000-01-01 VBA code: Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Columns(1)) Is Nothing Then On Error GoTo Safe_Exit Application.EnableEvents = False Dim rng As Range, str As String, rw As Long For Each rng In Intersect(Target, Columns(1)) str = rng.Value If Len(str) >= 8 Then With Sheet2 rw = .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row .Cells(rw, 1) = DateSerial(Left(str,4), Mid(str, 6, 2), Mid(str, 9, 2)) .Cells(rw, 2) = DateSerial(Mid(str, 11, 4), Mid(str, 16, 2), Mid(str, 19, 2)) End With End If Next rng End If Safe_Exit: Application.EnableEvents = True End Sub 

不pipe我粘贴到第一张工作表中的string有多less,这些date将会出现在第二张表上,直到1000年的date。我做错了什么?

Excel的基准date为自1899年12月30日午夜以来的天数,除了负date以外。

即使看起来您可以在1900年1月1日之前inputdate,但如果您注意到它们将会左alignment。 这表示它们已被接受为string值而不是date。

您可以修改您的代码来设置一个string值。 一个string的有效date将自动转换为date。 .Cells(rw,1)= Cstr(DateSerial(Left(str,4),Mid(str,6,2),Mid(str,9,2)))

请注意,如果select1904年date选项,则1/1/1904也可以是最小值。