2014-09-30 73 views
1

当在vba中运行文本到列时,它会将我的日期脉动为美国日期,而不是英国日期,只要它有可能这样做。例如,8月31日保持为8月31日,但9月1日更改为09年1月9日!VBA文本到列阅读日期格式如同美国

有没有什么办法可以指定所有的日期都是英国格式的BEFORE vba运行?因为即使只是重新格式化为美国日期以显示美国日期也不行,因为我们有运行if date < Today的代码,这当然会导致更改日期格式的问题。

数据以dd/mm/yyyy格式提供,但excel将其读取为mm/dd/yyyy!

+1

您需要的字段信息参数指定正确的格式。仍然不是100%可靠的,因为VBA非常以美国为中心,但如果您使用TextToColumns,它是唯一的选择。 – Rory 2014-09-30 11:45:53

+0

可能值得一试:'Cells.Range(“A:A”)。TextToColumns Destination:= Range(“A1”),Tab:= True,FieldInfo:= Array(1,4)' – pnuts 2014-10-17 02:13:09

+0

@Rory i我非常确定FieldInfo不适用于英国的日期,我知道FieldInfo:= Array(1,4)应该可以工作,但它只是忽略它,并且无论如何都会对美国造成影响 – Coder375 2016-10-28 16:26:05

回答

0

有这个情况下的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 
0

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格式的一部分。

+0

)你是否真的尝试过这个?因为我认为在VBA中存在一个使得它无效的bug。在excel中完美工作,但是在VBA中,上面的代码每次都会格式化为美国日期,它反过来也是一样的,所以如果你有英国日期(作为日期),并且你尝试使用texttocolumns来使它们成为文本,它们都以美国格式出现。在VBA中,texttocolumns函数只能用于美国格式。 – Coder375 2016-10-28 16:30:06

0

我有更好的选择。将文本列定义为文本:

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格式将创建文本字段,因此不会生成格式。

0

我今天遇到了同样的问题,我也在文本中使用了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 

希望这有助于。

感谢

汤姆