如何解决混合日期格式

问题描述 投票:0回答:2

我正在尝试在 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数据的许可。

vba date excel
2个回答
3
投票

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

编辑在第二个示例中,显然

28/9/2013 17:59
是9月28日。如果
10/01/13 12:11:00 PM
具有相同的格式(可能来自同一个文件),那么它是1月10日。但是如果格式不同,那么它可能是10月1. 如果您看到 AM 和 PM 的格式为
dd/mm/yy hh:mm;@
,那么您的某些数据是文本,并且没有可靠的“自动”方法可以在不知道文本约定(即是否 DMY或MDY),因此需要恢复源。

显然,大于 12 的“日”值实际上是月份,但当小于 13 时,这没有多大帮助,这取决于格式。

此外,考虑到您的来源多种多样,存在可能同时使用 1900 和 1904 约定甚至其他约定的风险(您的数据记录器可能采用 UNIX 时间,从 1970 年开始)。


2
投票

ActiveCell.Value = 日(临时)&“/”&月(临时)&“/”&年(临时)&“”&小时(临时)&“:”&分钟(临时)

也许代码将其读取为文本?试试这个(未经测试)

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
© www.soinside.com 2019 - 2024. All rights reserved.