【问题标题】:VBA Text-To-Columns Reading Date Format As USVBA Text-To-Columns 读取日期格式为美国
【发布时间】:2019-02-04 19:19:51
【问题描述】:

在 vba 中运行 text-to-columns 时,它会将我的日期作为美国日期而不是英国日期,只要它可以这样做。例如,8 月 31 日保持为 8 月 31 日,但 01 月 9 日更改为 0 月 9 日!

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

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

【问题讨论】:

  • 您需要在 FieldInfo 参数中指定正确的格式。仍然不是 100% 可靠,因为 VBA 非常以美国为中心,但如果您使用 TextToColumns,它是唯一的选择。
  • @Rory 我很确定 FieldInfo 不适用于英国日期,我知道 FieldInfo:=Array(1, 4) 应该可以工作,但它只是忽略了它,无论如何它都是美国的

标签: vba excel excel-2007


【解决方案1】:

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

【讨论】:

  • 你真的试过这个吗?因为我认为有一个错误使得这在 VBA 中无效。在 excel 中完美运行,但在 VBA 中,您上面的代码每次都会格式化为美国日期。它反过来做同样的事情,所以如果你有英国日期(作为日期)并且你尝试使用 texttocolumns 使它们成为文本,它们都以美国格式出现。在 VBA 中似乎 texttocolumns 函数仅适用于美国格式。
  • 这个答案帮助我解决了我的问题。如果根据您的要求编辑录制的宏。语句 'Array(1,2)' 指定 column = 1 和 xlcolumndatatype = 2,使用以下命令选择适当的 columndatatype:docs.microsoft.com/en-us/office/vba/api/excel.xlcolumndatatype
【解决方案2】:

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

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

【讨论】:

  • 这是 2013 年和 2010 年的,我用的是 2007 年的 :(
【解决方案3】:

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

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 格式会创建一个文本字段,因此不会有格式化。

【讨论】:

    【解决方案4】:

    这种情况有一个解决方法。在执行 TexttoColumn 之前首先从文本中获取日期部分。此日期将以文本形式显示。使用 Left、Mid 和 right 函数来获取日期、月份和年份,然后使用 vba 中的函数 dateserial 和这些参数。现在您将获得 2 种日期。文本格式的日期将采用英国格式,您可以将其存储在 Excel 的单元格中。其他是英国格式,将用于 if date 条件。您现在可以使用文本到列并忽略来自 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
    

    【讨论】:

      【解决方案5】:

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

      希望这会有所帮助。

      谢谢

      汤姆

      【讨论】:

        【解决方案6】:

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

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

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

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

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

        这是发生的事情: 出于某种原因,VBA 正确读取了已经日期格式的单元格,但随后在可能的情况下切换月份和日期,将它们写回为 MDY。要了解我的意思,您可以尝试使用“FieldInfo:=Array(1, 2)”将 TextToColumns 应用于日期格式单元格。 01.09.2019 表示 2019 年 9 月 1 日将变成一个文本单元格,其中“09/01/2019”表示 2019 年 1 月 9 日。

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

        【讨论】:

          猜你喜欢
          • 2016-03-08
          • 1970-01-01
          • 2017-06-28
          • 1970-01-01
          • 2014-06-28
          • 2017-03-30
          • 2021-11-18
          • 1970-01-01
          • 2021-09-22
          相关资源
          最近更新 更多