如何解决混合日期格式

时间:2014-01-29 06:00:54

标签: excel vba date excel-vba

我正在尝试在Excel 2010中编写VBA代码以进行一些时间计算。一切都按照我想要的方式工作,用于单元日期格式。 Excel表格是通过合并由不同PC和硬件数据记录器生成的几个.xlsx文件创建的。问题是某些工作表的日期为mm/dd/yy hh:mm:ss AM/PM,其他工作日为dd/mm/yy hh:mm:ss AM/PM,两者都混合在一个文件中。

我尝试将所有内容更改为Selection.NumberFormat = "dd/mm/yy hh:mm;@",但有些单元格不会更改。我也试过这个功能:

Function Arreglar_Fecha()
    Dim temp As String
    temp = ""
    Do While ActiveCell.Value <> ""
       temp = ActiveCell.Value
       ActiveCell.Value = Day(temp) & "/" & Month(temp) & "/" & Year(temp) & " " & Hour(temp) & ":" & Minute(temp)
       ActiveCell.Offset(1, 0).Select
    Loop
End Function

但是,有些细胞发生了变化,有些细胞没有变化。更糟糕的是,有些人日复一日地混在一起!

http://i.imgur.com/5yGEyzi.png

enter image description here

我可以访问一些原始的.xlsx文件,但也无法更改所有日期格式。

任何人都知道如何解决这个问题?

编辑我获得了放置原始Excel文件Excel Data的权限。

2 个答案:

答案 0 :(得分:3)

您必须追溯到您的源数据。 Excel本身无法知道例如1/2/2014应该是2月的第一个还是1月的第二个,只有它是41671或41641.

编辑在第二个示例中,显然28/9/2013 17:59是9月28日。如果10/01/13 12:11:00 PM具有相同的格式(可能来自同一个文件),那么它是1月10日。但如果格式不同,则可能是10月1日。如果您看到格式为dd/mm/yy hh:mm;@的AM和PM,那么您的一些数据是文本,并且没有可靠的“自动”方式将其切换为日期/时间序列号,不知道文本约定(即DMY或MDY),因此需要恢复源。

显然,'day'值大于12实际上是几个月,但是当小于13时,这取决于格式。

此外,鉴于您的各种来源,存在1900和1904惯例可能已被使用的风险,甚至可能还有其他公约(您的数据记录器可能在UNIX时间,从1970年开始)。

答案 1 :(得分:2)

  

ActiveCell.Value = Day(temp)&amp; “/”&amp;月(临时)&amp; “/”&amp;年(临时)&amp; “”&amp;小时(临时)&amp; “:”&amp;分钟(温度)

也许代码是以文本形式阅读的?试试这个(UNTESTED)

Sub Arreglar_Fecha()
    Dim temp As String, Tmp As String
    Dim D As String, M As String, Y As String
    Dim H As String, Mn As String

    Do While ActiveCell.Value <> ""
       temp = Trim(ActiveCell.Value)

       D = Trim(Split(temp, "/")(0))
       M = Trim(Split(temp, "/")(1))

       Tmp = Trim(Split(temp, "/")(2))

       Y = Trim(Split(Tmp, " ")(0))

       Tmp = Trim(Split(Tmp, " ")(1))

       H = Trim(Split(Tmp, ":")(0))
       Mn = Trim(Split(Tmp, ":")(1))

       ActiveCell.Value = Format(DateSerial(Val(Y), Val(M), Val(D)) & _
                          " " & TimeSerial(Val(H), Val(Mn), 0), _
                          "dd/mm/yy hh:mm;@")

       ActiveCell.Offset(1, 0).Select
    Loop
End Sub

尝试使用单个测试场景。以下内容为您13/08/13 05:31

Sub Test()
    Dim temp As String, Tmp As String
    Dim D As String, M As String, Y As String
    Dim H As String, Mn As String

    temp = "13/8/2013 5:31"

    D = Trim(Split(temp, "/")(0))
    M = Trim(Split(temp, "/")(1))

    Tmp = Trim(Split(temp, "/")(2))

    Y = Trim(Split(Tmp, " ")(0))

    Tmp = Trim(Split(Tmp, " ")(1))

    H = Trim(Split(Tmp, ":")(0))
    Mn = Trim(Split(Tmp, ":")(1))

    Debug.Print Format(DateSerial(Val(Y), Val(M), Val(D)) & _
                " " & TimeSerial(Val(H), Val(Mn), 0), _
                "dd/mm/yy hh:mm;@")
End Sub