我正在尝试在 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
但是,有些细胞发生了变化,有些则没有。更糟糕的是,有些人把日期和月份搞混了!
我可以访问一些原始的 .xlsx 文件,但也无法更改所有日期格式。
有人知道我该如何解决这个问题吗?
编辑在这里我获得了放置原始Excel文件Excel数据的许可。
您必须追溯到您的源数据。例如,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 年开始)。
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