Excel 宏中的“文本到列”将24小时转换为12小时格式

Excel 宏中的“文本到列”将24小时转换为12小时格式,excel,vba,Excel,Vba,我制作了一个宏,它执行文本到列的功能(将存储在一列中的日期和时间划分为另外两列,一列用于日期,一列用于时间) 但是,当我直接在Excel中执行此功能时,我会收到所需的输出:24小时格式的日期+时间,但当我运行与宏记录完全相同的过程时,输出是:12小时格式的日期+时间。使用AM/PM标记创建附加的第三列。宏对少数单元格正常工作,但对少数单元格无效 原始文件: 不带宏的输出(这就是我需要带宏的输出的方式): 带有宏的输出: 使用宏“> 你能建议我如何解决这个问题吗 Selection.TextT

我制作了一个宏,它执行文本到列的功能(将存储在一列中的日期和时间划分为另外两列,一列用于日期,一列用于时间)

但是,当我直接在Excel中执行此功能时,我会收到所需的输出:24小时格式的日期+时间,但当我运行与宏记录完全相同的过程时,输出是:12小时格式的日期+时间。使用AM/PM标记创建附加的第三列。宏对少数单元格正常工作,但对少数单元格无效

原始文件:

不带宏的输出(这就是我需要带宏的输出的方式):

带有宏的输出:

使用宏“>

你能建议我如何解决这个问题吗

Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
                        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
                        Semicolon:=True, Comma:=False, Space:=True, Other:=False, FieldInfo:= _
                        Array(Array(1, 4), Array(2, 1)), TrailingMinusNumbers:=True

我认为这是宏录制器错误。请尝试以下代码:

Sub ExtractTime()
'
' Extract time from date
'

'
    Dim Target As Range
    For Each Target In Selection
        If IsDate(Target) Then
            Target.Offset(0, 1).Value = Target.Value - Int(Target.Value)
            Target.Offset(0, 1).NumberFormat = "HH:MM:SS"
            Target.Value = Int(Target.Value)
        End If
    Next
End Sub

这似乎是论坛上已经提出的一个已知问题。无论如何,从
数据类型:=xlDelimited
切换到
数据类型:=xlFixedWidth
似乎可以做到这一点:

Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
                TrailingMinusNumbers:=True
结果是:


我觉得您的Windows区域设置是MDY,CSV文件的格式是DMY

发生了什么:

  • D
    12的日期被解释为字符串,并且没有附加
    AM/PM
当您执行
TTC
时,“实际日期”有两个空格,第三列中的
AM/PM
也有两个空格。“字符串”只有一个空格,因此在显示时进行拆分

被解释为日期的日期可能被错误地解释。换句话说,Excel认为您的
1-10-2019
2019年1月10日
,而它应该是
2019年10月1日

除了复杂的VBA例程外,解决此问题的
方法是正确导入数据,以便在数据到达工作表之前正确解释日期

您可以使用旧版导入向导或Power Query执行此操作


使用其中一种方法,您可以在空格上拆分,并指定日期为DMY,然后按照您的意愿格式化日期和时间。

我知道它很旧,但如果有人有相同的问题,下面的代码可以解决它:

FieldInfo:=Array(Array(1, 4), Array(2, 2), Array(3,9))

这部分代码表示第1列是日期,第2列(小时)是文本,第3列(如果将显示为am/pm)被跳过。这对我很有用。您可以添加尽可能多的数组()即使没有可跳过的列,也可以随意设置。

然后在文本到列之后添加一行,将日期时间设置为首选格式。文本到列之后,数据分为三列。因此,在AM/PM位于同一第二列以进行时间标识之前,格式设置不起作用。短数据的Windows区域设置是什么e格式?MDY或DMY?是使用文本编辑器打开时的实际CSV文件,与“原始数据”相同“?嗨,谢谢你的回复。不幸的是,它不起作用。谢谢你的更新,蒙蒂。我想知道为什么它对你不起作用——正如你在我的截图上看到的,它对我起作用了。在运行宏之前是否选择了整个列A?结果是什么(宏是否返回错误,或者是否运行但输出不正确)?