【问题标题】:TextToColumns function uses wrong delimiterTextToColumns 函数使用了错误的分隔符
【发布时间】:2015-06-09 07:24:11
【问题描述】:

我正在尝试打开一个目录中的所有 csv(分隔符是分号)文件,这是我认为应该可以工作的代码:

Sub test()
Dim MyFile As String
Dim MyDir As String

MyDir = Application.ActiveWorkbook.Path
MyFile = Dir(MyDir & "\" & "*.csv")
'set current directoy
ChDir MyDir

Application.ScreenUpdating = 0
Application.DisplayAlerts = 0


Do While MyFile <> ""
    Workbooks.Open (MyFile)

    'Parse it using semicolon as delimiters
    Range(Range("A1"), Range("A1").End(xlDown)).TextToColumns _
        DataType:=xlDelimited, _
         ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=True, Comma:=False, Space:=False, Other:=False '

    'next file in directory
    MyFile = Dir()
Loop

End Sub

但奇怪的是,它也使用逗号作为分隔符。如果我调试TextToColumns 行,我可以看到。

所以对于像这样的 csv 文件

test;test,test

我希望输出

test    test,test

但我实际上得到了

test    test

为什么?我的 Excel 设置有问题吗?

谢谢!

【问题讨论】:

    标签: excel csv vba


    【解决方案1】:

    问题出在这一行

     Workbooks.Open (MyFile)
    

    当您在 Excel 中打开文件时,它会以这种格式打开,因为它是逗号分隔文件

    然后当.TextToColumns 代码运行时,它将B 列替换为A 列中; 之后的“测试”。

    试试这个

    假设您的 csv 文件如下所示

    现在试试这个代码。一旦你了解它是如何工作的,只需在你的代码中调整它。我已经对代码进行了注释,以便您理解它不会有问题。

    Sub Sample()
        Dim wb As Workbook, ws As Worksheet
        Dim MyData As String, strData() As String
        Dim myFile As String
        Dim lRow As Long
    
        '~~> Replace this with your actual file
        myFile = "C:\Users\Siddharth\Desktop\test.csv"
    
        '~~> open text file in memory and read it in one go
        Open myFile For Binary As #1
        MyData = Space$(LOF(1))
        Get #1, , MyData
        Close #1
        strData() = Split(MyData, vbCrLf)
    
        '~~> Add a new workbook
        Set wb = Workbooks.Add
        '~~> Work with the 1st sheet
        Set ws = wb.Sheets(1)
    
        With ws
            '~~> Copy the array to worksheet
            .Range("A1").Resize(UBound(strData), 1).Value = strData
    
            '~~> get the last row of the data
            lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    
            '~~> Use text To columns now
            .Range("A1:A" & lRow).TextToColumns DataType:=xlDelimited, _
                                                ConsecutiveDelimiter:=False, _
                                                Tab:=False, _
                                                Semicolon:=True, _
                                                Comma:=False, _
                                                Space:=False, _
                                                Other:=False '
        End With
    End Sub
    

    这就是你得到的

    编辑:您拥有的另一个选项是重命名 csv 文件,然后按照Open csv file delimited by pipe character “|” or not common delimiter中的建议打开它

    【讨论】:

    • 谢谢,很好的回答。但是我不明白,当我手动打开文件时,Excel 是否正确(使用 ; 作为分隔符,因为它从我上次解析 csv 文件时就记住了它)。你知道为什么吗?
    • This你能检查一下你列出的分隔符​​是什么吗?
    • 这对我不起作用...它将 csv 的第一行向下重复到预期的 7K 行... Excel 2016 有什么变化吗?
    • 找到它...设置范围的值 = Application.Transpose(strData) 有效。 (编辑我的评论太迟了 3 分钟)