我正在尝试在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 Data的权限。
答案 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