宏查找和替换以将字符串更改为日期

时间:2019-01-14 08:21:51

标签: excel vba

我使用宏来查找和替换函数以将字符串更改为日期。它在某些日期上运行良好,但也出错了。 我使用的代码是:

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"

任何人都可以帮助代码使其正常工作吗?

非常感谢。

3 个答案:

答案 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