Excel VBA导入.txt文件导致错误的日期格式

时间:2016-03-18 10:44:12

标签: excel vba excel-vba date datetime

我正在导入一个以制表符分隔的文本文件(不是.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或类似的方式即时转换。希望这有助于澄清。

4 个答案:

答案 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文件)无任何格式。