当在vba中运行文本到列时,它会将我的日期脉动为美国日期,而不是英国日期,只要它有可能这样做。例如,8月31日保持为8月31日,但9月1日更改为09年1月9日!VBA文本到列阅读日期格式如同美国
有没有什么办法可以指定所有的日期都是英国格式的BEFORE vba运行?因为即使只是重新格式化为美国日期以显示美国日期也不行,因为我们有运行if date < Today
的代码,这当然会导致更改日期格式的问题。
数据以dd/mm/yyyy格式提供,但excel将其读取为mm/dd/yyyy!
当在vba中运行文本到列时,它会将我的日期脉动为美国日期,而不是英国日期,只要它有可能这样做。例如,8月31日保持为8月31日,但9月1日更改为09年1月9日!VBA文本到列阅读日期格式如同美国
有没有什么办法可以指定所有的日期都是英国格式的BEFORE vba运行?因为即使只是重新格式化为美国日期以显示美国日期也不行,因为我们有运行if date < Today
的代码,这当然会导致更改日期格式的问题。
数据以dd/mm/yyyy格式提供,但excel将其读取为mm/dd/yyyy!
也许你可以先用Application.International设置语言?
[http://msdn.microsoft.com/en-us/library/office/ff840213(v=office.15).aspx][1]
这是2013和2010年,我正在使用2007:( – DannyBland 2014-09-30 11:24:11
有这个情况下的workarround。在做TexttoColumn之前,先从文本中获取日期部分。此日期将以文字形式显示。使用Left,Mid和Right函数获取日期,月份和年份,然后使用vba中的函数dateserial和这些参数。现在你会得到2种类型的日期。文本格式的日期将以英国格式存储,您可以将其存储在Excel中的单元格中。其他是在英国格式,这将用于如果日期<今天条件。 U现在可以将文本用于列,并忽略来自texttocolumns的日期,并将日期用作文本。例如下面提到的代码 - “31/08/2014 part1 part2”
Sub t()
Dim myarr() As String
Dim cell As Range
For Each cell In Selection ' selection contains cells which text you need to convert text to columns
i = i + 1
myarr = Split(cell.Value, " ")
mydate = Val(Left(myarr(0), 2))
mymonth = Val(Mid(myarr(0), InStr(1, myarr(0), "/") + 1, 2))
myyear = Val(Right(myarr(0), 4))
date_american = DateSerial(myyear, mymonth, mydate)
date_uk = myarr(0)
Next cell
End Sub
pnuts注释是解决此问题的最简单方法。
说明:
运行“录制宏”,选择列,并启动文本到列向导。
在文本到列向导的第3页上,在'列数据格式'下,'日期'选项自动设置为'MDY'。将其更改为'DMY'。
停止宏,你会发现这段代码
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A:A"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 4), TrailingMinusNumbers:=True
的“4” =Array(1,4)
是确定DMY格式的一部分。
)你是否真的尝试过这个?因为我认为在VBA中存在一个使得它无效的bug。在excel中完美工作,但是在VBA中,上面的代码每次都会格式化为美国日期,它反过来也是一样的,所以如果你有英国日期(作为日期),并且你尝试使用texttocolumns来使它们成为文本,它们都以美国格式出现。在VBA中,texttocolumns函数只能用于美国格式。 – Coder375 2016-10-28 16:30:06
我有更好的选择。将文本列定义为文本:
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A:A"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 2), TrailingMinusNumbers:=True
使用2格式将创建文本字段,因此不会生成格式。
我今天遇到了同样的问题,我也在文本中使用了DMY,当手动执行时,如果在VBA中执行操作,那么在可能的情况下总是会更改为美国数据格式。
通过在右侧插入一个新列并使用= TEXT(Cell,“DD/MM/YYYY”),然后复制并粘贴这些值,我可以解决这个问题(这可能不适合您)。
之后我删除了原来的列,我也确保这个总是可以工作的,不管行数是多少,每次都用数据计算出最后一行。
下面的VBA段..
Sub Dateformat()
'sets i as last current row with data in
Dim i As Integer
Range("A2").Select
i = ActiveCell.End(xlDown).Row
Columns("D:D").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("D2").Select
ActiveCell.FormulaR1C1 = "=TEXT(RC[-1],""DD/MM/YYYY"")"
Selection.Copy
Range("D2:D" & i).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("C:C").Select
Selection.Delete Shift:=xlToLeft
End Sub
希望这有助于。
感谢
汤姆
您需要的字段信息参数指定正确的格式。仍然不是100%可靠的,因为VBA非常以美国为中心,但如果您使用TextToColumns,它是唯一的选择。 – Rory 2014-09-30 11:45:53
可能值得一试:'Cells.Range(“A:A”)。TextToColumns Destination:= Range(“A1”),Tab:= True,FieldInfo:= Array(1,4)' – pnuts 2014-10-17 02:13:09
@Rory i我非常确定FieldInfo不适用于英国的日期,我知道FieldInfo:= Array(1,4)应该可以工作,但它只是忽略它,并且无论如何都会对美国造成影响 – Coder375 2016-10-28 16:26:05