我的表格上有一列,即 F 列,其中全是日期。现在我需要这些日期采用“dd,mm,yyyy”格式,但有时原始数据中的日期是文本形式,即美国/亚美尼亚格式。为什么我应用宏将其转换为正确的格式,它有时会切换日期和月份,但如果我手动执行,则不会发生此类错误。
我使用粘贴值来获取工作表中的数据,这是我的代码。它显示了 dd/mmm/yyyy 格式的正确月份,但切换了月份和日期。
Range("F2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.NumberFormat = "dd/mmm/yyyy"
Selection.TextToColumns Destination:=Range("F2"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 4), TrailingMinusNumbers:=True
Selection.NumberFormat = "dd/mm/yyyy"
以单元格 F2 为例,日期为 2009 年 1 月 9 日,格式为 09/01/2009。
当我将文本分列时,日期显示为 2009/09/01。
当我将文本重复到列(不做任何更改)时,它会将日期(而不是格式)更改为 2009 年 9 月 1 日。
有人知道为什么会这样吗?如果我手动将文本分列,我可以整天重复此操作,并且它会保持我喜欢的格式。
只有在重复执行宏时才会出现此问题,我不确定我做错了什么。尝试将 fieldinfo 更改为 array(array(1,4),但无济于事。
希望有人可以帮忙。
答案1
您需要在 FieldInfo 参数中设置数据类型
Redim FieldInfoVal(1 To 1)
FieldInfoVal(1) = xlDMYFormat
没有 4 列,所以我使用 1 个数组
然后在 FieldInfo:= 之后传入 FieldInfoVal
您可以使用以下方法省去变量
FieldInfo:=Array(0, xlDMYFormat)
我认为数组是基于 1 的,所以它会忽略第 0 个成员,我只是输入了一个零。
我认为两种方法都可以。
答案2
我编译了这段代码,它为我完成了一项工作。
Sub FormatDate()
Application.ScreenUpdating = False
With Range("A2", Range("A" & Rows.Count).End(xlUp))
.EntireColumn.Insert
.NumberFormat = "@"
With .Offset(, -1)
.FormulaR1C1 = "=Text(RC[1],""dd/mm/yy"")"
.Offset(, 1).Value = .Value
.EntireColumn.Delete
End With
End With
Application.ScreenUpdating = True
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 4)
End Sub