【问题标题】:macro separates .csv by comma, despite separator set to semicolon宏用逗号分隔 .csv,尽管分隔符设置为分号
【发布时间】:2019-02-01 23:55:29
【问题描述】:

在下面附加的代码中,尽管逗号分隔符设置为 false 并且分号分隔符设置为 true,但宏打开 .csv 时使用分号和逗号分隔的值(至少看起来是这样)。

我尝试切换代码片段的顺序,但无济于事。 代码的历史和目的可以在这个线程中找到:VBA run-time error '1004' while looping through .csv file。请告知我在这里做错了什么或遗漏了什么?

(与this问题相关的主题。)

Dim wrk As Workbook
Dim Sh As Worksheet
Dim findMatch As Range, searchInColumn As Range
Dim i As Long, j As Long, k As Long
Dim chosenFile As Integer
Dim xlFileName As String
Dim chooseFiles As Office.FileDialog

Set DictChanged = CreateObject("Scripting.Dictionary")
Set DictToBeDone = CreateObject("Scripting.Dictionary")

Application.ScreenUpdating = False


Set chooseFiles = Application.FileDialog(msoFileDialogFilePicker)

    With chooseFiles

        .AllowMultiSelect = True
        .Title = "Please select the file."
        .InitialFileName = "c:\"
        .InitialView = msoFileDialogViewList
        .Filters.Add "All", "*.*"

    End With


If chooseFiles.Show = -1 Then
    For k = 1 To chooseFiles.SelectedItems.Count
        xlFileName = chooseFiles.SelectedItems(k)

        Set wrk = Application.Workbooks.Open(xlFileName)
        Set Sh = wrk.Worksheets(1)               

        If InStr(1, wrk.Name, ".csv") Then

            Sh.Range(Range("A1"), Range("A1").End(xlDown)).TextToColumns _
            DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=True, Comma:=False, Space:=False, Other:=False

        End If
End If

所描述的问题发生在可见代码中。根据要求在以下输出阶段:

输出阶段:

初始文件

+---------+---------+---------+---------------- --+------------+-----------------+ |第 1 列 |第 2 列 |第 3 列 |第 4 列 |第 5 列 |第 6 栏 | +---------+---------+---------+------------------+ ------------+-----------------+ | 123456 | 654321 |一些ID |带逗号的值 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+ ------------+-----------------+ | 123456 | 654322 |一些ID |价值观,带逗号 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+ ------------+-----------------+ | 123456 | 654323 |一些ID |价值观,带逗号 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+ ------------+-----------------+ | 123456 | 654324 |一些ID |值,uesWithComma |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+ ------------+-----------------+ | 123456 | 654325 |一些ID |带逗号的值 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+ ------------+-----------------+ | 123456 | 654326 |一些ID |带逗号的值 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+ ------------+-----------------+ | 123456 | 654327 |一些ID |带逗号的值 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+ ------------+-----------------+ | 123456 | 654328 |一些ID |带逗号的值 |一些价值观 |一些其他值 |

2.AfterPickingFileInFileDialog

+--------------------------------------------- -------------------+-------------------------------- ------------+ |第 1 列;第 2 列;第 3 列;第 4 列;第 5 列;第 6 列 |第 2 列 | +-------------------------------------------------- ----------------+------------------------------------------------ --------+ | 123456;654321;SomeID;ValuesWithComma;SomeValues;SomeOtherValues | 654321 | +-------------------------------------------------- ----------------+------------------------------------------------ --------+ | 123456;654322;SomeID;值 | With Comma;SomeValues;SomeOtherValues | +-------------------------------------------------- ----------------+------------------------------------------------ --------+ | 123456;654323;SomeID;值 | With Comma;SomeValues;SomeOtherValues | +-------------------------------------------------- ----------------+------------------------------------------------ --------+ | 123456;654324;SomeID;Val | uesWithComma;SomeValues;SomeOtherValues | +-------------------------------------------------- ----------------+------------------------------------------------ --------+ | 123456;654325;SomeID;ValuesWithComma;SomeValues;SomeOtherValues | 654325 | +-------------------------------------------------- ----------------+------------------------------------------------ --------+ | 123456;654326;SomeID;ValuesWithComma;SomeValues;SomeOtherValues | 654326 | +-------------------------------------------------- ----------------+------------------------------------------------ --------+ | 123456;654327;SomeID;ValuesWithComma;SomeValues;SomeOtherValues | 654327 | +-------------------------------------------------- ----------------+------------------------------------------------ --------+ | 123456;654328;SomeID;ValuesWithComma;SomeValues;SomeOtherValues | 654328 | +-------------------------------------------------- ----------------+------------------------------------------------ --------+

3.AfterLastCondition

+---------+---------+---------+---------------- -+------------+-----------------+ |第 1 列 |第 2 列 |第 3 列 |第 4 列 |第 5 列 |第 6 栏 | +---------+---------+---------+------------------+- ------------+------------------+ | 123456 | 654321 |一些ID |带逗号的值 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+- ------------+------------------+ | 123456 | 654322 |一些ID |价值观 | | | +---------+---------+---------+------------------+- ------------+------------------+ | 123456 | 654323 |一些ID |价值观 | | | +---------+---------+---------+------------------+- ------------+------------------+ | 123456 | 654324 |一些ID |瓦尔 | | | +---------+---------+---------+------------------+- ------------+------------------+ | 123456 | 654325 |一些ID |带逗号的值 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+- ------------+------------------+ | 123456 | 654326 |一些ID |带逗号的值 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+- ------------+------------------+ | 123456 | 654327 |一些ID |带逗号的值 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+- ------------+------------------+ | 123456 | 654328 |一些ID |带逗号的值 |一些价值观 |一些其他价值观 | +---------+---------+---------+------------------+- -----------+-----------------+

【问题讨论】:

  • “至少看起来是这样的” 似乎需要进行更多调查才能真正确认这里存在问题。贴出的代码不完整,两次调用TextToColumns。我的理解是你首先打开文件,它都出现在一个列中,然后你调用 texttocolumns 。您需要检查每个阶段的输出并了解发生了什么
  • 您好像打开同一个文件 3 次?
  • 一般来说,导入 .csv 文件比打开文件要好。如果您必须打开它,并且它具有非标准分隔符(或与您的 Windows 区域设置不同的日期格式,那么您可以将文件类型更改为 .txt。
  • 请参阅此处以获取带有分隔符 stackoverflow.com/questions/17832618/… 的“打开”示例,但显然您需要确保扩展名是 .txt。
  • “初始文件”没有分号。而且您的数据屏幕截图对于进行适当的故障排除几乎毫无用处。它不能被复制/粘贴到工作表中。可以尝试 OCR 程序,或手动输入。不得不做其中任何一个都会让那些可能会帮助你的人感到沮丧。为了使数据有用,请编辑您的问题以将其作为文本发布,可能使用此Markdown Tables Generator,或者可能将*.csv 文件(已删除敏感信息)上传到某个公共网站并在您的原始问题中发布链接

标签: excel vba


【解决方案1】:

@Tim Williams 和 @Nick.McDermaid 评论您的代码存在问题。目前尚不清楚您想要实现什么。但是,关于打开分号分隔的文本文件,您可以将文件重命名为 .txt 并像

一样打开
xlFileName = chooseFiles.SelectedItems(k)
        TmpFlName = Path & "TmpCsv.txt"
        If Dir(TmpFlName) <> "" Then Kill TmpFlName
        FileCopy xlFileName, TmpFlName
        Workbooks.OpenText Filename:=TmpFlName, Origin:= _
        1250, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False _
        , Space:=False, Other:=False, TrailingMinusNumbers:=True, Local:=False

问题是分隔符选项仅在使用.txt 文件而不是.csv 时有效。

【讨论】:

    【解决方案2】:

    感谢@Ahmed AU 回答和上面的 cmets,我编辑了我的代码,所以它现在似乎可以工作了。它应该适用于 .csv 和 .xlmx 文件。这是代码的更长版本:

    Sub FixCSV()
    
    Dim wrk As Workbook
    Dim Sh As Worksheet
    Dim findMatch As Range, searchInColumn As Range
    Dim i As Long, j As Long, k As Long, lastRow As Long, lastColumn As Long
    Dim chosenFile As Integer
    Dim xlFileName As String
    Dim chooseFiles As Office.FileDialog
    
    Set chooseFiles = Application.FileDialog(msoFileDialogFilePicker)
    
        With chooseFiles       
            .AllowMultiSelect = True
            .Title = "Please select the file."
            .InitialFileName = "c:\"
            .InitialView = msoFileDialogViewList
            .Filters.Add "All", "*.*"            
        End With           
    
    If chooseFiles.Show = -1 Then
        For k = 1 To chooseFiles.SelectedItems.Count
            xlFileName = chooseFiles.SelectedItems(k)
    
                If InStr(1, xlFileName, ".csv") Then
                    TmpFlName = path & "TmpCsv.txt"
                    If Dir(TmpFlName) <> "" Then Kill TmpFlName
                    FileCopy xlFileName, TmpFlName
                    Workbooks.OpenText FileName:=TmpFlName, origin:= _
                    1250, StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
                    ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False _
                    , Space:=False, Other:=False, TrailingMinusNumbers:=True, Local:=False
    
                    Set wrk = Application.Workbooks("TmpCsv.txt")
                    Set Sh = wrk.Worksheets(1)
                Else
                    Set wrk = Application.Workbooks.Open(xlFileName)
                    Set Sh = wrk.Worksheets(1)
                End If
    
            lastRow = Sh.Cells(Sh.Rows.Count, "A").End(xlUp).Row
            lastColumn = Sh.Cells(1, Sh.Columns.Count).End(xlToLeft).Column           
    
           i = 2           
           Do Until i = lastRow                          
              'do something          
           Loop
    
        If InStr(1, wrk.Name, "TmpCsv.txt") Then             
            wrk.SaveAs FileName:=xlFileName, FileFormat:=xlCSV, Local:=True
            wrk.Close False
            Kill TmpFlName
        Else
            wrk.Close 'savechanges:=true
        End If
    
        Next k
    End If
    
    End Sub
    

    保存为 .csv 时,逗号作为分隔符弹出,再次破坏文件 - user2726096 的回答:https://stackoverflow.com/a/18492514/10348607 帮助我解决了问题。

    【讨论】:

      猜你喜欢
      • 2016-09-05
      • 2010-11-06
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多