Excel 2013 ....我使用此vba代码将系统日期更改为当前日期,而不是手动输入2024年8月23日,我只在单元格内输入23,然后按回车键将其更改为2024年8月23日。所以我使用此代码来避免 1990 年 1 月。但我的问题是每当我删除输入日期的单元格时。它没有删除,而是将其更改为 7 月 31 日。
请帮忙
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range, rint As Range, r As Range
Set rng = Range("A1:A10")
Set rint = Intersect(rng, Target)
For Each r In rint
Application.EnableEvents = False
r.Value = DateSerial(Year(Date), Month(Date), r.Value)
Application.EnableEvents = True
Next r
End Sub
当您删除单元格时,将调用该代码。
当到达
r.Value = DateSerial(Year(Date), Month(Date), r.Value)
行时,它会查找,但没有得到r.Value
的结果。
因此,它将
r.Value
视为 0
。
因此,它会将
r.Value
更改为 2024-08-00
— 正如您所说的那样。 从编程角度来说,本月(八月)的第零天与上个月(七月)的最后一天相同。 因此,2024-08-00
变为 2024-07-31
。因此:在使用它之前,您应该可能检查r.value
是否在1到31之间。 (否则,如果您输入
实际日期,您也会收到完全不同的错误:
2024-08-23
= 45527
→ DateSerial(2024, 08, 45527)
= 2114-04-18
)更高级的检查是查看它是否在 1 和本月的天数之间。 这可以防止“二月输入 30”(三月 1st 或 2nd,具体取决于是否是闰年)之类的问题。
Application.EnableEvents = False
If IsNumeric(r.Value) Then 'In case you typed text
If r.Value = Application.Median(1, r.Value, Day(DateSerial(Year(Date),Month(Date)+1,0))) Then 'Valid for this month
r.Value = DateSerial(Year(Date), Month(Date), r.Value)
End If
End If
Application.EnableEvents = True