【问题标题】:Date format dd:mm:yy:hh:mm:ss to a dd/mm/yy hh:mm:ss日期格式 dd:mm:yy:hh:mm:ss 到 dd/mm/yy hh:mm:ss
【发布时间】:2012-08-29 22:02:09
【问题描述】:

我想使用 VBA 将 dd:mm:yy:hh:mm:ss 格式的文件中存储的日期转换为可用于使用 VBA 处理文件的 excel 中排序的日期。我找不到任何紧凑的东西。我已经尝试将文本转换为列,然后将分离出来的值组合回日期和时间,但这对于大数据文件来说既麻烦又慢。

有谁知道可以使用的快速方法吗??

【问题讨论】:

    标签: vba datetime excel


    【解决方案1】:

    也许这会转换A1:A10范围内的日期:

    [A1:A10]=[IF({1},TEXT(SUBSTITUTE(A1:A10,":",""),"00\/00\/00  00\:00\:00"))]
    

    【讨论】:

    • + 1 像往常一样漂亮的一只萝莉。这不也有帮助吗? =SUBSTITUTE(LEFT(A1,8),":","/") & " " & RIGHT(A1,8)
    • 是的,那样可能会更有效率。
    • Lori_m,非常感谢你成功了。悉达多,我试过你的建议,它产生了“#NAME?”不知道是什么问题。
    • 试试:[A1:A10]=[IF({1},SUBSTITUTE(LEFT(A1:A10,8),":","/") & " " & RIGHT(A1:A10,8))]。您可以从即时窗口中输入此内容,如果您想包含在代码中,最好将 A1:A10 替换为 Date 之类的命名范围。
    【解决方案2】:

    下面怎么样

    Option Explicit
    
    Sub test()
    Dim dtStr As String
    Dim dtArr() As String
    Dim rebuildDt As String
    Dim dtDte As Date
    Dim dtStr2 As String
    
    
    dtStr = "29:08:12:23:37:04"
    dtArr = Split(dtStr, ":")
    rebuildDt = dtArr(0) & "/" & dtArr(1) & "/" & dtArr(2) _
        & " " & dtArr(3) & ":" & dtArr(4) & ":" & dtArr(5)
    
    dtDte = CDate(rebuildDt)
    dtStr2 = Format(dtDte, "dd/mm/yy hh:mm:ss")
    Debug.Print dtStr2
    
    End Sub
    

    【讨论】:

      【解决方案3】:

      一个快速的方法你可以使用下面的代码来

      1. 将某个文件夹下所有文件的DateLastModified读入数组中
      2. 在临时工作表中转储和排序数组
      3. 存储排序后的数组(在下面的变量Y中)

      代码

      Sub GetFiles()
      Dim objFSO As Object
      Dim objFolder As Object
      Dim objFile As Object
      Dim strFolder As String
      Dim strFileName As String
      Dim lngCnt As Long
      Dim X()
      Dim Y
      Dim ws As Worksheet
      
      With Application
      .ScreenUpdating = False
      .DisplayAlerts = False
      .EnableEvents = False
      End With
      
      strFolder = "c:\temp"
      strFileName = Dir(strFolder & "\*.*")
      
      Set objFSO = CreateObject("scripting.filesystemobject")
      Set objFolder = objFSO.getfolder(strFolder)
      
      ReDim X(1 To objFolder.Files.Count, 1 To 2)
      
      For Each objFile In objFolder.Files
      lngCnt = lngCnt + 1
      X(lngCnt, 1) = objFile.Name
      X(lngCnt, 2) = objFile.datelastmodified
      Next
      
      Set ws = Sheets.Add
      ws.[a1].Resize(UBound(X, 1), 2) = X
      ws.Range("A:B").Sort ws.Range("B1"), xlDescending
      Y = ws.[a1].Resize(UBound(X, 1), 2)
      ws.Delete
      
      With Application
      .ScreenUpdating = True
      .DisplayAlerts = True
      .EnableEvents = True
      End With
      
      End Sub
      

      【讨论】:

        【解决方案4】:

        只使用 Excel 公式,没有 VBA 的方法

        =DATE(2000+MID(A1,7,2),MID(A1,4,2),LEFT(A1,2))+TIMEVALUE(RIGHT(A1,8))

        我假设,例如,凌晨 1 点表示为 01:00:00,即不会在任何地方丢弃读数为零,对于 6 个元素中的每个元素总是两个字符。

        【讨论】:

        • @Jean-FrançoisCorbett,是的,你是对的。对于那些糟糕的程序员,我是一个很好的候选人,让事情按照我想要的方式工作,不太关心实际后果。
        【解决方案5】:

        您可以使用split 函数并解析出字符串,因为您将(假设这里)有dd:mm:yy:hh:mm:ss,所以前三个是日期,后三个是时间。

        【讨论】:

        • @yosukesabai 的第一个建议
        【解决方案6】:

        这是一个简单的 VBA 函数:

        Function ConvertDateFormat(dateInOldFormat As String)
            Dim d As Date
            Dim ss() As String
            ss = Split(dateInOldFormat, ":")
            d = DateSerial(CInt(ss(2)), CInt(ss(1)), CInt(ss(0))) _
                + TimeSerial(CInt(ss(3)), CInt(ss(4)), CInt(ss(5)))
            ConvertDateFormat = Format(d, "dd/mm/yy hh:mm:ss")
        End Function
        

        用法:

        s = ConvertDateFormat("30:08:12:08:52:11")
        'returns "30/08/12 08:52:11"
        

        在这里,我什至不会考虑处理 Y2K 问题...在此函数内部,我假设年份“12”表示公元 12 年,但这对最终结果没有影响无论如何都是2位数的年份。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-14
          • 2011-09-05
          • 2019-06-25
          • 2020-02-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多