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

时间:2014-09-30 10:57:55

标签: excel vba excel-vba excel-2007

在vba中运行text-to-columns时,只要有可能,就可以将我的日期作为美国日期而不是英国日期。例如,8月31日停留时间为8月31日,但01 - 9月更改为09年1月1日!

有没有办法在vba运行之前指定所有日期都是英国格式?甚至只是重新格式化为美国日期以显示美国日期不起作用,因为我们的代码运行if date < Today,这当然会导致更改日期格式的问题。

数据以dd / mm / yyyy格式输入,但excel读取为mm / dd / yyyy!

6 个答案:

答案 0 :(得分: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

=Array(1,4)中的“4”是确定DMY格式的部分。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这种情况有一个工作场所。首先在执行TexttoColumn之前从文本中获取日期部分。这个日期将以文字显示。使用Left,Mid和right函数获取日期,月份和年份,然后使用vba中的函数dateserial和这些参数。现在您将获得2种日期。文本格式的日期,将采用英国格式,您可以将其存储在Excel中的单元格中。其他是英国格式,将用于如果日期&lt;今天条件。您现在可以使用文本到列并忽略来自texttocolumns的日期并使用日期作为文本。下面提到的相同代码,例如 - &#34; 31/08/2014 part1 part2&#34;

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

答案 3 :(得分:0)

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

pointOfContact.put("shipment_version", "1");
pointOfContact.put("testimonial_version", "3");
pointOfContact.put("point_of_contact_version", "2");
data.put("username", "korea");
data.put("order_point_of_contact", pointofContact);
jsonObject.put("method", "version");
jsonObject.put("data", data);

使用2格式会创建一个文本字段,因此不会形成格式。

答案 4 :(得分: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

希望这有帮助。

由于

汤姆

答案 5 :(得分:0)

此观察结果可能有用(Excel365 64位):

结论: 请小心,仅将TextToColumn应用于实际包含文本格式日期的单元格,而不应用于Excel已识别为日期的单元格。

观察: 我使用VBA使用“ range.value =”将包含日期的数组中的数据填充到单元格中。 结果将是用文本格式填充数据的单元格(例如,单元格中包含01.09.2019,但是Excel不知道它是1月1日的日期,但只能看到文本)。 然后,我使用VBA TextToColumns将这些单元格转换为指定“ FieldInfo:= Array(1,4)”的实际日期。格式确实是DMY。

这很好用,但是当Excel中已将范围中的某些单元格识别为日期时,所有事情都搞砸了。

在我的情况下: 使用“值=(来自arry变量的日期)”将数据添加到列的底部,从而生成文本格式的单元格。我想使用TextToColumn将数据重新格式化为日期。但是,每次将TextToColumns应用于整个包含先前已重新格式化的单元格的列,而不是仅应用于新添加的数据。

这是发生了什么: 由于某种原因,VBA会正确读取已日期格式的单元格,但在可能的月份和日期之间切换,以便将其写回MDY。要了解我的意思,您可以尝试使用“ FieldInfo:= Array(1,2)”将TextToColumns应用于日期格式的单元格。 1月1日为2019年9月1日。2019年9月1日将变为带有“ 09/01/2019”的文本单元格。

因此,当以日期格式写回时,我们必须谨慎地将TextToColumn仅应用于真正的文本格式数据。可能的解决方法是先以某种方式将整个数据读入数组,然后再写回以确保所有数据以相同的格式开头。