VBA文本到列读取日期格式美国

问题描述 投票:2回答:6

当在VBA运行文本到列,它PULS我的日期为美国的日期,而不是英国的日期,只要有可能就这样做。因此,例如,8月31日保持为8月31日,但01月修改09-JAN!

有什么办法可以指定所有的日期是在英国格式VBA运行之前?作为甚至只是重新格式化美国日期显示为美国的日期将不会工作,因为我们有一个运行if date < Today,这当然会导致与不断变化的日期格式问题的代码。

在格式DD / MM / YYYY的数据源,但擅长把它读成MM / DD / YYYY!

excel vba excel-vba excel-2007
6个回答
2
投票

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
投票

也许你可以用Application.International先设置语言?

[http://msdn.microsoft.com/en-us/library/office/ff840213(v=office.15).aspx][1]


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
投票

有这种情况下的workarround。首先获取日期部分从做TexttoColumn之前的文本。这一日期将是文本。使用左,中,右功能来获得日期,月份和年份,然后用这些参数使用功能dateserial在VBA。现在,您将得到2型日期。日期文本格式,这将是您可以在Excel中的细胞储存英国格式。另一种是将因为如果日期<今天条件下使用的英国格式。 ü现在可以使用文本列和忽略来自texttocolumns和使用日期作为文本而不是日期。对于例如下文提到的相同的代码 - “31/08/2014视频1视频2”

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
投票

我今天遇到了同样的问题,上述在可能的变化总是以美国的数据格式描述我太习惯在文字DMY以做手工的时候时的工作列,但在VBA。

我得到解决此(可能不适合你)通过插入新的一列到右侧,并使用= TEXT(细胞“ 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

希望这可以帮助。

谢谢

汤姆


0
投票

也许这个观察是有帮助的(Excel365 64位):

结论:小心TextToColumn仅适用于实际包含文本格式的日期细胞和细胞并无已确认为Excel的日期。

观察:我用VBA填充细胞与来自阵列使用含有日期数据“range.value =”。其结果将是填充有文本格式的数据(例如2019年1月9日在细胞中,但Excel不知道它是1。2019年9月的日期,但只看到文本)细胞。然后我用VBA TextToColumns把这些细胞变成实际日期指定“字段信息:=阵列(1,4)”。格式确实DMY。

这个工作很好,但所有的东西弄乱当在范围内的一些细胞已经确认为Excel的日期。

场景在我的情况:在使用“值=(从ARRY可变日期)”,从而导致文本格式的单元格的列的底部加入数据。我想用TextToColumn将数据重新格式化为日期。但TextToColumns是适用于那些已经被重新格式化之前,而不是只新添加的数据整列containng细胞每次。

这是发生了什么事:出于某种原因,VBA正确读取已日期格式单元格,但再绕月和日在那里可以将它们写回为MDY切换。要明白我的意思,你可以尝试使用应用TextToColumns为日期格式单元格“字段信息:=阵列(1,2)”。 2019年9月1日为1. 2019年9月,会变成一个文本单元为“2019年9月1日”为2019 9月。

因此,我们必须要小心写回日期格式时TextToColumn只应用到真正的文本格式的数据。一个可能的解决办法可能会以某种方式先读取整个数据到一个数组中,并把它写回,以确保所有的数据都是一样的格式开始的。

© www.soinside.com 2019 - 2024. All rights reserved.