带有时间的日期字符串的 TextToColumns

Posted

技术标签:

【中文标题】带有时间的日期字符串的 TextToColumns【英文标题】:TextToColumns for date strings with time 【发布时间】:2017-04-08 02:18:57 【问题描述】:

Excel 2010。我正在将 csv 文件导入 excel 中以进行进一步处理。不幸的是,在 csv 日期字段中,日期以不同于我 PC 的默认格式(“mm/dd/yyyy”)的格式(“dd/mm/yyyy”)表示。所以我需要将每个日期字段(列)转换为我的格式,然后才能开始处理数据。

Range.TextToColumns 方法就像一个魅力:

Sub convertDateColumn()
    Dim myColumn As Range

    Set myColumn = Range("A1:A10")
    myColumn.TextToColumns Destination:=myColumn.Cells(1), DataType:=xlDelimited, FieldInfo:=Array(0, xlDMYFormat)

End Sub

(假设日期字符串在 A1:A10 列范围内)

...它将字符串“1/2/2017”正确转换为日期 1-Feb-2017 或字符串“25/2/2017”转换为日期 25-Feb-2017。

但是,有些字段不是纯日期字符串,还包含时间信息。例如,“1/2/2/2017 09:30:00”表示 2017 年 2 月 1 日上午 9:30,或“25/2/2017 09:30:00”表示 2017 年 2 月 25 日上午 9:30。

不幸的是,上面示例宏中使用的 TextToColumns 方法似乎不再起作用。 “1/2/2017 09:30:00”被错误地转换为 2017 年 1 月 2 日上午 9:30 并且“25/2/2017 09:30:00”没有被转换。这在某种程度上是正常的,因为字段信息 (xlDMYFormat) 不再准确描述字段格式。

我的问题:有没有办法将 TextToColumns 与包含时间信息的字符串一起使用?或者,是否有其他方法可以转换所有列的日期/时间字符串,而无需遍历每个单元格(这很容易但速度很慢)?

【问题讨论】:

我唯一的想法是您可以创建一个自定义函数将字符串转换为日期时间,例如stringToDate(),然后在textToColumn 之后调用该函数。不需要循环。范围(A1:A10) = stringToDate(B1) 您想将单元格中的格式从“mm/dd/yyyy”转换为“dd/mm/yyyy”??并且不使用VBA。我有仪式吗? 请参阅this question 上的 cmets - 他们可能会给您一些指导。 似乎不止一个问题,第二个可能与源数据中使用的时间分隔符有关。从“1/2/2017”到“2/1/2017”的转换只能通过将原始字符串读取为字符串,然后将该字符串转换为日期,然后再转换回字符串来实现。使用无法识别的时间分隔符,可能会删除时间组件。仅当您可以获取原始日期/时间序列时,才有可能找到解决方案,因为所有转换都基于您 PC 的区域设置。 要使用时间格式的TTC,您需要拆分时间(分隔符=空格)。这适用于您的数据吗?您还需要一种处理字符串日期或日期/时间的方法。最简单的方法是进行真正的导入 (Data ► Get External Data ► From Text) 并在数据写入工作表之前正确处理数据。这将需要能够使用Space 作为分隔符。如果不能,请告诉我,因为我有一个宏可以将混合日期/时间转换为混合格式。 【参考方案1】:

要将 TTC 与时间格式一起使用,您需要拆分时间(分隔符 = 空格)。这适用于您的数据吗?

您还需要一种处理字符串日期或日期/时间的方法。

最简单的方法是进行真正的导入(数据 ► 获取外部数据 ► 从文本)并在数据写入工作表之前正确处理数据。这将需要能够使用 Space 作为分隔符。






请注意,最后一个屏幕截图中的日期已转换为我的 MDY 的“正常”设置,因此它们都代表 2 月的日期。

如果这不起作用,请告诉我,因为我有一个宏应该能够以混合格式转换混合日期/时间。

【讨论】:

【参考方案2】:

也许您可以将日期时间字段输入为xlGeneralFormat,然后在TextToColumns 处理后格式化第一列:

myColumn.NumberFormat = "mm/dd/yyyy hh:mm:ss"

例如:

Sub convertDateColumn()
    Dim myColumn As Range

    Set myColumn = Range("A1:A10")
    myColumn.TextToColumns Destination:=myColumn.Cells(1), DataType:=xlDelimited, FieldInfo:=Array(0, xlGeneralFormat)

    ' update format
    myColumn.NumberFormat = "mm/dd/yyyy hh:mm:ss"

End Sub

【讨论】:

以上是关于带有时间的日期字符串的 TextToColumns的主要内容,如果未能解决你的问题,请参考以下文章

带有公式的单元格在 Excel 2010 中不计算

使用箭头从带有时区的字符串中解析日期和时间

如何从带有周围字符的 oracle varchar 获取日期时间

将带有 GMT 的字符串转换为日期时间格式 - php [重复]

通过python将带有'th''st''rd''nd'的日期字符串转换为日期格式

Typescript - 从带有日期字符串的 Json 字符串自动转换为带有 Date 属性的对象