【发布时间】:2012-08-29 22:02:09
【问题描述】:
我想使用 VBA 将 dd:mm:yy:hh:mm:ss 格式的文件中存储的日期转换为可用于使用 VBA 处理文件的 excel 中排序的日期。我找不到任何紧凑的东西。我已经尝试将文本转换为列,然后将分离出来的值组合回日期和时间,但这对于大数据文件来说既麻烦又慢。
有谁知道可以使用的快速方法吗??
【问题讨论】:
我想使用 VBA 将 dd:mm:yy:hh:mm:ss 格式的文件中存储的日期转换为可用于使用 VBA 处理文件的 excel 中排序的日期。我找不到任何紧凑的东西。我已经尝试将文本转换为列,然后将分离出来的值组合回日期和时间,但这对于大数据文件来说既麻烦又慢。
有谁知道可以使用的快速方法吗??
【问题讨论】:
也许这会转换A1:A10范围内的日期:
[A1:A10]=[IF({1},TEXT(SUBSTITUTE(A1:A10,":",""),"00\/00\/00 00\:00\:00"))]
【讨论】:
=SUBSTITUTE(LEFT(A1,8),":","/") & " " & RIGHT(A1,8)
[A1:A10]=[IF({1},SUBSTITUTE(LEFT(A1:A10,8),":","/") & " " & RIGHT(A1:A10,8))]。您可以从即时窗口中输入此内容,如果您想包含在代码中,最好将 A1:A10 替换为 Date 之类的命名范围。
下面怎么样
Option Explicit
Sub test()
Dim dtStr As String
Dim dtArr() As String
Dim rebuildDt As String
Dim dtDte As Date
Dim dtStr2 As String
dtStr = "29:08:12:23:37:04"
dtArr = Split(dtStr, ":")
rebuildDt = dtArr(0) & "/" & dtArr(1) & "/" & dtArr(2) _
& " " & dtArr(3) & ":" & dtArr(4) & ":" & dtArr(5)
dtDte = CDate(rebuildDt)
dtStr2 = Format(dtDte, "dd/mm/yy hh:mm:ss")
Debug.Print dtStr2
End Sub
【讨论】:
一个快速的方法你可以使用下面的代码来
DateLastModified读入数组中Y中)代码
Sub GetFiles()
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim strFolder As String
Dim strFileName As String
Dim lngCnt As Long
Dim X()
Dim Y
Dim ws As Worksheet
With Application
.ScreenUpdating = False
.DisplayAlerts = False
.EnableEvents = False
End With
strFolder = "c:\temp"
strFileName = Dir(strFolder & "\*.*")
Set objFSO = CreateObject("scripting.filesystemobject")
Set objFolder = objFSO.getfolder(strFolder)
ReDim X(1 To objFolder.Files.Count, 1 To 2)
For Each objFile In objFolder.Files
lngCnt = lngCnt + 1
X(lngCnt, 1) = objFile.Name
X(lngCnt, 2) = objFile.datelastmodified
Next
Set ws = Sheets.Add
ws.[a1].Resize(UBound(X, 1), 2) = X
ws.Range("A:B").Sort ws.Range("B1"), xlDescending
Y = ws.[a1].Resize(UBound(X, 1), 2)
ws.Delete
With Application
.ScreenUpdating = True
.DisplayAlerts = True
.EnableEvents = True
End With
End Sub
【讨论】:
只使用 Excel 公式,没有 VBA 的方法
=DATE(2000+MID(A1,7,2),MID(A1,4,2),LEFT(A1,2))+TIMEVALUE(RIGHT(A1,8))
我假设,例如,凌晨 1 点表示为 01:00:00,即不会在任何地方丢弃读数为零,对于 6 个元素中的每个元素总是两个字符。
【讨论】:
您可以使用split 函数并解析出字符串,因为您将(假设这里)有dd:mm:yy:hh:mm:ss,所以前三个是日期,后三个是时间。
【讨论】:
这是一个简单的 VBA 函数:
Function ConvertDateFormat(dateInOldFormat As String)
Dim d As Date
Dim ss() As String
ss = Split(dateInOldFormat, ":")
d = DateSerial(CInt(ss(2)), CInt(ss(1)), CInt(ss(0))) _
+ TimeSerial(CInt(ss(3)), CInt(ss(4)), CInt(ss(5)))
ConvertDateFormat = Format(d, "dd/mm/yy hh:mm:ss")
End Function
用法:
s = ConvertDateFormat("30:08:12:08:52:11")
'returns "30/08/12 08:52:11"
在这里,我什至不会考虑处理 Y2K 问题...在此函数内部,我假设年份“12”表示公元 12 年,但这对最终结果没有影响无论如何都是2位数的年份。
【讨论】: