如何解决混合date格式

我想在Excel 2010中编写VBA代码来进行一些时间计算。 一切工作,因为我想但是细胞date格式。 Excel表格是通过合并由不同PC和硬件数据logging器生成的几个.xlsx文件而创build的。 问题在于有些纸张的date为mm/dd/yy hh:mm:ss AM/PM和其他dd/mm/yy hh:mm:ss AM/PM ,两者混合在一个文件中。

我试图改变一切Selection.NumberFormat = "dd/mm/yy hh:mm;@"但有些细胞只是不改变。 我也试过这个function:

 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

在这里输入图像说明

我有权访问一些原始的.xlsx文件,并且在那里也无法更改所有的date格式。

任何人有任何想法如何解决这个问题?

编辑在这里我得到了把原来的Excel文件Excel数据的权限。

ActiveCell.Value = Day(temp)&“/”&Month(temp)&“/”&Year(temp)&“”&Hour(temp)&“:”&Minute(temp)

也许代码正在阅读文本? 试试这个(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 

尝试一个单一的testing场景的作品。 下面给你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 

你将不得不追溯到你的源数据。 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;@那么您的某些数据是文本,并且没有可靠的“自动”切换方式这到一个date/时间的序列号,而不知道文本约定(即是否DMY或MDY),因此需要恢复到源。

显然,大于12的“日”值实际上是几个月,但是对于小于13的日子,这取决于格式。

另外,考虑到你的各种来源,1900年和1904年的惯例都有可能被使用,甚至可能还有其他的惯例(你的数据logging器可能在UNIX时间,1970年开始)。