我使用宏来查找和替换函数以将字符串更改为日期。它在某些日期上运行良好,但也出错了。 我使用的代码是:
Worksheets(“Sheet 1”).Columns(“H”).Replace What:=“.”,
Replacement:=“/“,
SearchOrder:=xlByColumns,
MatchCase:=True
原始字符串为"11.01.2019"
,日期应为11/01/2019
,即11 January 2019
。
但是当我使用该宏时,它被转换为{strong> 2019年11月1日。
如果日期大于12,则代码运行良好。
例如01/11/2019
将正确转换为"13.01.2019"
。
任何人都可以帮助代码使其正常工作吗?
非常感谢。
答案 0 :(得分:1)
当Windows
区域设置告诉Excel
应该使用English
日期格式D/M/Y
时,会发生这种情况。
然后,默认日期分隔符也与en_US一样为/
,但日期部分的顺序与en_US(M/D/Y
)不同。当VBA
运行时,它总是在en_US语言环境设置中运行,因此11/01/2019
已成为VBA
中的2019年11月1日。但是13/01/2019
不是en_US中的日期。因此VBA
不会将其转换为日期。然后Excel
根据Windows区域设置将字符串“ 13/01/2019”转换为正确的日期。
解决方法:
请改用Range.TextToColumns method。
Worksheets("Sheet 1").Columns("H:H").TextToColumns Destination:=Range("H1"), DataType:=xlDelimited, FieldInfo:=Array(1, xlDMYFormat)
您需要避免多次致电TextToColumns
。因为这样,VBA
会再次将D/M/Y
日期重新转换为en_US M/D/Y
。
答案 1 :(得分:0)
我记得VBA自动假定American date notation。 试试:
Worksheets(“Sheet 1”).Columns(8).NumberFormat = "dd-mm-yyy"
Worksheets(“Sheet 1”).Columns(“H”).Replace What:=“.”, Replacement:=“/“, SearchOrder:=xlByColumns, MatchCase:=True
答案 2 :(得分:0)
以下内容将以yyyy-mm-dd
格式构造一个日期,无论您身在何处,都应接受该日期,并相应地填充单元格(但应根据系统设置进行格式化)。
Dim r As Range, cell As Range
Set r = [H2:H999] ' or wherever your data is
For Each cell In r
cell = Right(cell, 4) & "-" & Right(Left(cell, 5), 2) & "-" & Left(cell, 2)
Next cell