我正在导入一个以制表符分隔的文本文件(不是.csv,.txt)。第一列包含日期,有些是dd / mm / yyyy格式,其他是dd / mm / yyyy hh:mm:ss格式。
运行以下代码时,一些日期以mm / dd / yyyy格式显示。这些事情没有什么不寻常的,它似乎是随机发生的(有些人有时间,有些人不管,但无论如何,源头仍然是一个月 - ) -
Sub LQMTrend()
Dim fp, textLine As String
Dim iRow As Integer
Dim lineArr() As String
Dim ws As Worksheet
Set ws = Sheets("Data")
iRow = 1
fp = "//srv57data1\product_support\xChange\Beam Profile Image Tool\LQM Reviews\Log files\Log file.txt"
Open fp For Input As #1
Do Until EOF(1)
Line Input #1, textLine
lineArr = Split(textLine, vbTab)
For x = 0 To UBound(lineArr)
ws.Cells(iRow, x + 1) = lineArr(x)
Next x
iRow = iRow + 1
Loop
Close #1
我已经尝试将lineArr声明为变体,但它没有任何区别。有什么想法吗?
由于
编辑:我感谢这与Excel VBA: importing CSV with dates as dd/mm/yyyy类似,但最简单的答案在每种情况下都不同 - 对于CSV文件,'使用本地日期设置'导入选项解决了问题,这在打开.txt时不可用文件,日期必须使用CDate或类似的方式即时转换。希望这有助于澄清。
答案 0 :(得分:2)
正如亚西亚斯提到的,有些日期可能含糊不清。对于Excel,日期只是一个格式化的数字,它表示自01/01/1900以来的天数,今天(2016年3月3日)excel不超过42447.使用该数字时,不会有任何歧义。日期格式。
我建议改变
ws.Cells(iRow, x + 1) = lineArr(x)
到
With ws.Cells(iRow, x + 1)
If x = 0 Then
.Value = CLng(CDate(lineArr(x)))
.NumberFormat = "mm/dd/yyyy;@"
Else
.Value = lineArr(x)
End If
End With
答案 1 :(得分:2)
Excel首先尝试将日期字符串转换为本地设置的格式。如果失败,例如月份优于12,那么它将反转月份和日期。由于您正在处理这两种格式,您最好的选择可能是自己解析日期:
Sub Macro1()
Dim arr() As String
Dim mydate As Date
' US format 6 may 2015
arr = Split("05/06/2015", "/")
mydate = DateSerial(Year:=arr(2), Month:=arr(0), Day:=arr(1))
' UK format 6 may 2015
arr = Split("06/05/2015", "/")
mydate = DateSerial(Year:=arr(2), Month:=arr(1), Day:=arr(0))
End Sub
答案 2 :(得分:0)
您需要将字符串日期转换为“实际日期”(序列号),然后再将其写入工作表。这是一种方法。更改数组元素以反映原始文件中的正确列。
'convert date to proper date before writing to worksheet
'Assuming date is in column 3
Dim DT As Date, TM As Date, V As Variant
V = Split(lineArr(2))
'is there a time segment
If UBound(V) = 1 Then
TM = TimeValue(V(1))
Else
TM = 0
End If
'convert the date segment to a real date
V = Split(V(0), "/")
DT = DateSerial(V(2), V(1), V(0)) + TM
'write it back to linearr
lineArr(2) = DT
答案 3 :(得分:0)
您应该在导入后更改日期。文本文件(如CSV文件)无任何格式。