将 'yyyymmdd hhmmss' 转换为 'mm/dd/yy hh:mm'

Posted

技术标签:

【中文标题】将 \'yyyymmdd hhmmss\' 转换为 \'mm/dd/yy hh:mm\'【英文标题】:Convert 'yyyymmdd hhmmss' to 'mm/dd/yy hh:mm'将 'yyyymmdd hhmmss' 转换为 'mm/dd/yy hh:mm' 【发布时间】:2016-02-14 04:12:52 【问题描述】:

我有一行数据(单元格 A3 及以下)包含yyyymmdd hhmmss 格式的 Unix 时间戳,我正在尝试将其转换为 mm/dd/yy hh:mm 格式自动

当我的数据从单元格 A1 开始时,我到目前为止的代码有效,但我需要 A1 保持空白,因此数据从 A2 开始。 Here是A列的示例截图:

Sub auto_open()
'
' auto_open Macro
'

'
ChDir "C:\"
Workbooks.Open      Filename:="C:\Users\username\Desktop\file1.csv"
Intersect(Sheets("file1").Range("A:EW"),     Sheets("file1").UsedRange).Copy     ThisWorkbook.Sheets("Golden").Range("A2")
Windows("file1.csv").Activate
Application.CutCopyMode = False
ActiveWorkbook.Close SaveChanges = False

Dim x As Integer
Dim y As String
Dim z As String
Dim w As String

NumRows = Range("A3").End(xlDown).Row

Windows(ThisWorkbook.Name).Activate
For x = 2 To NumRows
     z = Cells(x, 1).Value
     y = Mid(z, 5, 2) & "/" & Mid(z, 7, 2) & "/" & Left(z, 4)
     w = Mid(z, 10, 2) & ":" & Mid(z, 12, 2) & ":" & Mid(z, 14, 2)
     y = y + TimeValue(w)
     Cells(x, 1).Value = y
Next x

Range("A3").Select

End Sub

无论我将范围设置为 A2 还是 A3 以及向下,都会出错。

有人推荐吗?

调试突出显示y = Mid(z, 5, 2) & "/" & Mid(z, 7, 2) & "/" & Left(z, 4),但我不确定问题出在哪里。

不幸的是,格式化单元格(自定义>mm/dd/yyyy hh:mm:ss)在我的情况下也不起作用。

【问题讨论】:

你得到什么错误?将z 更改为Range 并尝试z = Cells(x,1),然后看看它是否有效。这可能是最快的解决方法。 运行时错误 13:类型不匹配 使用您使用的方法,您不会到达最后一行。您有 numrows 计算范围内的行数。假设您的数据的最后一行在第 20 行,numrows 将等于 18,然后当传递到 for 循环时,您只会转到第 18 行而不是 20。更改为 numRows = Range("A3").end(xlDown).Row 这将在这里的实例中为您提供 20 . 然后你的 for 循环将从 3 转到 NumRows。这不是你的问题,但以后会成为问题。 将 'dim z as string' 更改为 'dim z as range' 并更改 z=Cells(x,1) - 给出运行时错误 91,未设置对象变量或块变量。 @Brad - 天哪!感谢您指出这一点。 【参考方案1】:

这将完全没有循环:

Sub kyle()
    With [a3].Resize([a1048576].End(xlUp).Row - 2)
        .Value = Evaluate("transpose(transpose(DATE(MID(" & .Address & ",1,4),MID(" & .Address & ",5,2),MID(" & .Address & ",7,2)) + TIME(MID(" & .Address & ",10,2),MID(" & .Address & ",12,2),MID(" & .Address & ",14,2))))")
    End With
End Sub

注意:然后您可以为日期使用任何数字格式。

【讨论】:

我感觉你会使用 []。很好地使用 Evaluate。 用他的话说,“我可以一步完成,没有循环。”而我们其余的苦工仍然停留在黑暗时代......喃喃......喃喃讽刺>。我真的需要以这种方式开始思考,它会节省我编码的时间。 @ScottCraner 如果您喜欢使用数组公式,您可以使用 VBA 中的 Evaluate() 制作大量干草。 ;) 是的,这就是问题所在,我不喜欢它们并且一直避免使用它们。我终于看到了他们的好处。我怀疑我永远不会达到你的水平,但我正在学习。 @ScottCraner 只需要练习。【参考方案2】:

试试这个:

Sub Kyle()
  Dim cell As Range

  ThisWorkbook.Activate

  For Each cell In Range("A2", Cells(Rows.Count, "A").End(xlUp))
    If cell.Value Like "######## ######" Then
      cell.Value = CDate(Format(cell.Value, "@@@@-@@-@@@@@:@@:@@"))
    End If
  Next cell
End Sub

然后按您喜欢的方式格式化列。

对我来说,这可以转换

20150904 213613 20150124 194003 20150404 163056 20151220 100509 20150510 213512

到这里:

2015 年 9 月 4 日 21:36 2015 年 1 月 24 日 19:40 2015 年 4 月 4 日 16:30 2015 年 12 月 20 日 10:05 2015 年 5 月 10 日 21:35

【讨论】:

这很好用,非常感谢。但是它让我在工作表的末尾,有没有人可以让我在顶部? @KyleL - 在最后(就在End Sub 之前)添加Cells(1,1).Select【参考方案3】:

@ExcelHero 通过电子邮件回答了我的问题。以下是任何需要将来参考的人的工作代码。

    With [a3].Resize([a65536].End(xlUp).Row - 2)
    If Len(.Item(1)) = 15 Then
        .Value = Evaluate("transpose(transpose(DATE(MID(" & .Address & ",1,4),MID(" & .Address & ",5,2),MID(" & .Address & ",7,2)) + TIME(MID(" & .Address & ",10,2),MID(" & .Address & ",12,2),MID(" & .Address & ",14,2))))")
    End If
    .NumberFormat = "mm/dd/yyyy hh:mm"
End With

【讨论】:

以上是关于将 'yyyymmdd hhmmss' 转换为 'mm/dd/yy hh:mm'的主要内容,如果未能解决你的问题,请参考以下文章

如何使用pandas将hhmmss.ff格式转换为datetime

将 24 小时值转换为 HHMMSS - 时间

SSIS 任务数据流 - 将平面时间值 HHMMSS 转换为 MSSql Time(7) 字段

Jmeter函数 参数

Unix shell脚本中的正则表达式[关闭]

sas将几分几秒转化为秒