我发现这个问题非常复杂,并试图使其尽可能简单,但确实遗漏了一些重要细节!道歉。这是我发现的更完整的版本:
首先我应该解释一下我是从 .csv 读取日期(和其他字段)并将其存储回 .xls
我使用的是在 Windows/7 上运行的 Office 2002
使用 2 个示例日期:27/4/2015 和 7/5/2015,采用 dd/mm/yyyy 字符串格式(来自 csv)
我发现的是:
将 27/4/2015 文本日期字段从 csv 读取到尺寸为 STRING 的变量中并存储到 dd/mm/yyyy DATE 格式的 xls 字段中会生成一个读取 27/4/2015 的单元格,但会将其转换为格式化为数字的单元格也会产生 27/4/2015。另一方面,2015 年 7 月 5 日生成一个字符串,该字符串读取 2015 年 7 月 5 日,并将其转换为格式化为数字的单元格,生成 42131。
将 27/4/2015 文本日期字段从 csv 读取到无尺寸变量中并以 dd/mm/yyyy DATE 格式存储到 xls 字段中会生成一个读取 27/4/2015 的单元格,但会将其转换为格式化的单元格因为 Number 也会产生 27/4/2015 而 7/5/2015 读取 5/7/2015 并将其转换为格式化为 Number 的单元格会产生 42190。
将 27/4/2015 文本日期字段从 csv 读取到尺寸为 DATE 的变量中,并以 dd/mm/yyyy DATE 格式存储到 xls 字段中,生成一个读取 27/4/2015 的单元格并将其转换为格式化为 Number 的单元格生成 42121。另一方面,7/5/2015 生成一个字符串,读取 5/7/2015 并将其转换为格式化为 Number 的单元格生成 42190。
因此,上述前 3 种方案不会为所有日期规范产生预期的结果。
要解决此问题,我执行以下操作:
Input_Workbook.Activate
ilr = Range("A5000").End(xlDown).End(xlDown).End(xlDown).End(xlUp).Row
For i = 1 To ilr
Input_Workbook.Activate
If IsDate(Cells(i, 1).Value) Then
d1 = Cells(i, 1).Value
d1 = Replace(d1, "/", "-")
ThisWorkbook.Activate
Cells(14, 5).Value = d1
d1 = Cells(14, 5).Value
If VarType(d1) = vbString Then
d1 = CDate(d1)
End If
Cells(i, 1).Value = d1
End If
Next
最初用于存储日期的单元格格式为 GENERAL,最终目标单元格格式为 DATE (dd/mm/yyyy)。
我没有足够的脑细胞来完全解释在这个过程中日期发生了什么,但它对我有用,当然目标细胞的选择在上面的代码块中是完全随机的。