Excel 将使用空格分隔符的txt文件转换为制表符分隔符

Excel 将使用空格分隔符的txt文件转换为制表符分隔符,excel,vba,Excel,Vba,我有一个excel文件,它从第三方自动生成的各种txt文件导入定价。我用一个txt文件遇到了一个障碍,因为它使用空格分隔,而其他文件使用制表符。由于空格分隔,当我分割数据时,我在每列中得到不同的值 以下是我到目前为止打开和读取文本文件的内容 usFileName = PathName & "\" & "Prices.txt" If fs.FileExists(usFileName) Then Set US = fs.Ope

我有一个excel文件,它从第三方自动生成的各种txt文件导入定价。我用一个txt文件遇到了一个障碍,因为它使用空格分隔,而其他文件使用制表符。由于空格分隔,当我分割数据时,我在每列中得到不同的值

以下是我到目前为止打开和读取文本文件的内容

        usFileName = PathName & "\" & "Prices.txt"

        If fs.FileExists(usFileName) Then
            Set US = fs.OpenTextFile(usFileName, 1)

            theData = US.ReadLine
            getDate = Split(theData, Chr(0))
            curDate = Trim(Left(getDate(0), 10))

            If curDate = ActiveSheet.Range("Sheet_Date") Then
                    Do While Not US.AtEndOfStream
                        On Error Resume Next
                        Ln = US.ReadLine
                        Cols = Split(Ln, "  ")
                        Price = Trim(Cols(7))
                        NameTrim = Trim(Replace(Cols(1), "USO-", ""))
                        CellName = Replace(NameTrim, "-", "_") & "_" & Trim(Cols(2))

                        If ActiveSheet.Range(CellName) Is Nothing Then
                            ''Do Nothing here
                            On Error Resume Next
                        Else

                            Set TxtRng = ActiveSheet.Range(CellName)

                            If TxtRng = ActiveSheet.Range(CellName) Then
                                TxtRng.Value = Price
                            End If
                        End If
                    Loop

                Else
                    MsgBox ("The current sheet date does not match the US file import date.")
                End If

            US.Close
        Else
            MsgBox ("The file Prices.txt does not exist.")
        End If
这是txt文件的外观:

01/11/2019 06:00 PM  USO-FOX-USO  E10           8.9929     0.0000
01/11/2019 06:00 PM  USO-FOX-USO  CON8HE10      1.3212    -0.0244
01/11/2019 06:00 PM  USO-FOX-USO  CON8HE10TT    1.3232    -0.0244
这就是Cols变量的样子

试试看

Sub Test()

    Dim PathName As String
    Dim usFileName  As String

    PathName = "Your path"
    usFileName = PathName & "\" & "Prices.txt"

    Workbooks.OpenText Filename:=usFileName, _
        StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), _
        Array(19, 1), Array(32, 1), Array(48, 1), Array(55, 1))

End Sub

您可以尝试删除空格并按以下方式替换:

    Ln = US.ReadLine
    Do While (InStr(Ln, "  ") > 0)
        Ln = Replace(Ln, "  ", " ")
    Loop
    'The only problem I see is the case where you have Time (6:00 PM) this 
    '    would replace the space with Tab. in that case, I would do the following:
    Ln = Replace(Ln, " PM", "PM")
    Ln = Replace(Ln, " AM", "AM")
    Ln = Replace(Ln, " ", vbTab)

    'And then put them back
    Ln = Replace(Ln, "PM", " PM")
    Ln = Replace(Ln, "AM", " AM")

    'Finally, split the columns
    Cols = Split(Ln, vbTab)
如果要尝试使用固定宽度,请执行以下操作(在Ln=US.Readline之后):


在错误恢复下一步时使用
的方法是一种非常糟糕的做法。这一行隐藏了所有的错误消息,但是错误仍然会发生,您只是看不到它们,因为这会使您失明。但问题是,您无法修复您看不到的错误。如果你不修复它们,你的代码就不能工作。删除这些出错时的
“继续下一步”
行,并正确修复错误。我收到的错误是因为单元格名称不存在或无法正确匹配单元格。我知道这是一种不好的做法,但它忽略的错误在这一点上与我无关。然后用这种方式修复它,它只忽略你想要的特定错误,而不是像现在这样忽略所有错误。您无法在此状态下调试/处理代码,因为它是正确的。确保错误恢复下一步时的
正好位于预期错误所在的行之前,并在预期错误所在的行之后立即使用
错误转到0
重新启用错误报告!另请注意,错误恢复下一步时的
不仅会隐藏下一条错误消息,就像它看起来的那样。相反,它会隐藏所有消息,直到
错误转到0
End Sub
我将其删除,并且没有错误。是的,我尝试过这样做。即使我使用powerquery之类的工具将文件导入excel,它也会引发一个问题。获取所需列的唯一方法是使用fixed with。好的,我在回答的末尾添加了一段额外的代码。试试看。@iamner2000小心,不能删除空格。这将使您的数据崩溃,例如,如果一个字段为空,则所有其他字段将向左移动一个字段!因此,数据列的位置会发生变化。这只能用固定长度的字段来解决。@Pᴇʜ我为OP提供了两个不同的选项。如果你看第二个,你会发现我也提供了一个固定宽度的版本(只有mid功能)。Thx tho。
    '01/11/2019 06:00 PM  USO-FOX-USO  E10           8.9929     0.0000    
    'Do the following only if (InStr(Ln, "  ") > 0)
    strCol1 = Mid(Ln, 1, 21)  
    strCol2 = Mid(Ln, 22, 13)  
    strCol3 = Mid(Ln, 35, 13)  
    strCol4 = Mid(Ln, 48, 11)  
    strCol5 = Mid(Ln, 59, Len(Ln))