【发布时间】:2016-03-18 05:20:03
【问题描述】:
我有一个 Excel 文件,其中包含一些格式为“2016 年 3 月 6 日”的日期,我想将其转换为“d/MM/yyyy”或“6/3/2016”,以便使用像 @987654327 这样的 Excel 公式@ 以提取部分日期。
我写了一个小宏来帮助我解决这个问题,它只是像在输入数据集中手动替换日期一样。
Sub MonthReplace()
Dim res As Boolean
Dim i As Long
Dim monthArray As Variant
monthArray = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
For i = LBound(monthArray) To UBound(monthArray)
res = Range("RawDataset").Replace(" " + monthArray(i) + ", ", "/" + Format(i + 1) + "/")
Next i
End Sub
结果是一个不稳定的数据集。请查看之前和之后的图像。
有些转换正确,而另一些则互换月份和日期。当我以前不使用宏替换月份时,不会出现此行为。 Excel 中的默认日期格式是根据我想要的格式设置的。
日期的系统区域设置:
【问题讨论】:
-
您系统的默认短日期格式似乎是
m/d/yyyy,而不是d/m/yyyy。见 3 月 6 日。 2016 => 2016 年 3 月 6 日和 3 月 2 日。 2016 => 2016 年 3 月 2 日。所以 3 月 17 日。 2016 年无法从 17/3/2016 转换为日期格式,因为第 17 个月未知。 -
@AxelRichter 添加了我的日期设置的屏幕截图。虽然你说的有道理,但是为什么 excel 的行为在手动和基于宏的方法中有所不同?
-
有什么理由不用CDate来转换每个字符串?
-
哦,对不起,我的错。我没有考虑过 VBA 的行为。 VBA 将始终为
en_us和m/d/yy。所以必须要么设置这种格式,要么使用CDate("dd/mm/yyyy")进行转换。