VBA将分隔文本文件导入Excel

VBA将分隔文本文件导入Excel,excel,text-files,delimiter,vba,Excel,Text Files,Delimiter,Vba,我正在尝试使用vba将文本文件导入excel。我拥有的文本文件将所有数据放在一行中,并包含两个分隔符“|”和“,”。其中,“,”将数据分隔为列,“|”将数据分隔为行 我有一个代码,但它似乎做了相反的事情,因为我对vba非常陌生,我真的不知道哪里出了问题 我在想,如果有其他方法来处理vba,它会执行这样的操作,如果它识别出分隔符,它会将数据移动到指定的单元格中吗 下面是我的文本文件的外观 27/2/2017 17:14:32 | 54,11,6,32,58,83,0 | 0,0,0,0,0,0,0

我正在尝试使用vba将文本文件导入excel。我拥有的文本文件将所有数据放在一行中,并包含两个分隔符“|”和“,”。其中,“,”将数据分隔为列,“|”将数据分隔为行

我有一个代码,但它似乎做了相反的事情,因为我对vba非常陌生,我真的不知道哪里出了问题

我在想,如果有其他方法来处理vba,它会执行这样的操作,如果它识别出分隔符,它会将数据移动到指定的单元格中吗

下面是我的文本文件的外观

27/2/2017 17:14:32 | 54,11,6,32,58,83,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,69,8,86,0,241,255 | 0,71,69,404,0,553,0 | 15,0,0,0,53,0,0 | 0,0,0,0,0,0,0 | 0,867,2,18,0,939,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 16,0,0,0,0,0,85 | 647,509,18,82,18,670,85 | 1433,0,0,0,0,0,0 | 1432,882,0,0,0,939,0 | 32,861,1,20,0,938,0 | 0,887,0,0,0,939,0 | 0,886,0,0,0,939,0 | 12,801,4,42,0,912,0 | 0,867,0,0,0,939,0 | 0,0,0,0,0,0,0 | 0,890,0,0,0,939,0 | 0,871,0,0,0,930,85 | 0,891,0,0,0,939,0 | 0,892,0,0,0,939,0 | 0,894,0,0,0,939,0 | 0,895,0,0,0,954,0 | 0,0,0,0,0,0,0 | 0,905,0,0,0,954,0 | 0,792,6,35,0,897,85 | 4,697,40,202,0,952,0 | 0,640,13,108,0,807,0 | 0,0,0,0,507,0,0 | 60,24,23,211,1128,296,0 | 4,81,16,148,569,348,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 77,224,22,367,159,791,0 | 118,42,1,7,1051,104,0 | 58,0,0,0,654,0,0 | 260,0,0,0,642,0,0 | 172,0,0,0,1241,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1434,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1434,0,0 | 0,0,0,0,1433,0,0 | 114,0,0,0,1284,0,0 | 0,0,0,0,1429,0,0 | 0,0,0,0,1353,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1434,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1432,0,0 | 0,0,0,0,1434,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 86,89,1,51,1279,141,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1434,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1433,0,0 | 0,0,0,0,1434,0,0 | 0,0,0,612,751,613,0 | 0,0,2,662,0,710,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,0,0 | 0,0,0,0,0,3,0 | 
这是我的密码

Private Sub CommandButton1_Click()

Dim sPath As String, sLine As String
Dim oFile As String
Dim i As Long
Dim workRange As Range
Dim destCell As Range


Set destCell = Range("A1")
Set workRange = Range("A1" & ":" & Range("A1").End(xlDown).Address)

Unload Me
oFile = Application.GetOpenFilename()

i = 1

Open oFile For Input As #1 ' Open file for input.
Do While Not EOF(1) ' Loop until end of file.
    Input #1, sLine ' Read data

    i = i + 1
    Range("A" & i).Formula = sLine  ' Write data line


Loop
Close #1 ' Close file.


'Text to Columns
    With workRange
    .TextToColumns Destination:=destCell, DataType:=xlDelimited, _
     TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
     Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="|", _
     FieldInfo:=Array(1, 1), TrailingMinusNumbers:=False
    End With

Application.ScreenUpdating = True
End Sub
我希望结果是这样的


编辑以删除日期异议并声明我的变量

Dim aCol, aRow, aNames, colNow As Long, rowNow As Long, sLine As String
'Text to Columns
aRow = Split(sLine, "|")
With ActiveSheet
    .Cells(2, 1) = Trim(Left(aRow(0), InStr(aRow(0), " ")))
    '.Cells(2, 1) = Format(DateValue(aRow(0)), "d/m/yy")
    For rowNow = 1 To UBound(aRow)
        aCol = Split(aRow(rowNow), ",")
        For colNow = 0 To UBound(aCol)
            Sheet1.Cells(rowNow + 1, colNow + 2) = aCol(colNow)
        Next
    Next
End With
哦,编辑以添加列标题:

aNames = Array("Date and Time", "John", "Kate", "Sean", "Stephen", "Brian", "Philip", "Peter")
For colNow = 0 To UBound(aNames)
    ActiveSheet.Cells(1, colNow + 1) = aNames(colNow)
Next

修改代码以使其更清晰,它现在可以工作了。请参阅下面的代码

Private Sub CommandButton1_Click()

Dim text As String, textline As String
Dim Cell As Range
Dim strLine() As String
Dim aCol, aRow, aNames, colNow As Long, rowNow As Long
Dim oldDate As Date, newDate As Date


Unload Me
myFile = Application.GetOpenFilename("Text Files (*.txt), *.txt")

If myFile = False Then
Exit Sub
'MsgBox ("No File Select. Exit")

Else

'Open and read file
Open myFile For Input As #1
    Do Until EOF(1)
        Line Input #1, textline
        text = text & textline
    Loop
Close #1

aRow = Split(textline, "|")
With ActiveSheet

    .Cells(2, 1) = Trim(Left(aRow(0), InStr(aRow(0), " ")))

    For rowNow = 1 To UBound(aRow)

        aCol = Split(aRow(rowNow), ",")
        For colNow = 0 To UBound(aCol)
            ActiveSheet.Cells(rowNow + 1, colNow + 2) = aCol(colNow)
        Next
    Next

End With
End If
End Sub

为什么不在导入文件之前用换行符替换
|
。这将使它更容易。@Peh我无法替换,因为文本文件是在其他设备中生成的。您好,谢谢您的回复。谢谢你的回复。我在这一行收到一个类型错误:。单元格(2,1)=格式(日期值(aRow(0)),“d/m/yy”)@Peh,你是对的,你是错的。您强调日期问题是对的,但我的本地日期格式是d/m/y,数据中的日期是“27/2/2017 17:14:32”。因此,我的日期计算对我来说是可行的,也符合数据,即d/m/y。如果数据是y/m/d或m/d/y,我会用不同的方法计算日期。顺便说一句,DATESERIAL不是万灵药,因为它取决于先验知识,即日期的哪一部分是年,哪一部分是月,哪一部分是日。如果一个数据日期的格式不同,总有一天你会把一年塞进一天!无论如何,我在这里选择的解决方案只是从时间戳中去掉时间并显示原始日期,OP可以根据自己的选择进行按摩。剩下的就看学生了!在添加声明后,我仍然收到类型不匹配错误。是否更新了日期行。单元格(2,1)=修剪(左(aRow(0),仪表(aRow(0),“”)