【问题标题】:Export to pipe delimited .txt file without quotes导出到不带引号的管道分隔的 .txt 文件
【发布时间】:2016-10-13 14:04:50
【问题描述】:

我创建了一个 VBA 代码,可将数据从单个硬编码工作表导出到 export.txt 文件。我不得不使用两个 For 循环,因为我不知道我会以什么不同(和简单)的方式跳过包含来自导出角度的不必要信息(另一个宏的文件类型和主键)的两行。尽管如此,宏还是完成了它的工作......

Sub VBA_Write_to_a_text_file()
Dim filename As String
Dim rng As Range
Dim cellValue As Variant
Dim i As Integer
Dim j As Integer

filename = Application.ThisWorkbook.Path & "/export.txt"
Open filename For Output As #1

Set rng = Sheets(22).Range("A1:G1")
For i = 1 To rng.Rows.Count
    For j = 1 To rng.Columns.Count
        cellValue = rng.Cells(i, j).Value
            If j = rng.Columns.Count Then
            Write #1, cellValue
        Else
            Write #1, cellValue,
        End If
    Next j
Next i

Set rng = Sheets(22).Range("A4:G18")
For i = 1 To rng.Rows.Count
    For j = 1 To rng.Columns.Count
        cellValue = rng.Cells(i, j).Value
            If j = rng.Columns.Count Then
            Write #1, cellValue
        Else
            Write #1, cellValue,
        End If
    Next j
Next i

Close #1
End Sub

...除了两个问题:

  1. 管道分隔符问题:我无法更改逗号“,”管道分隔符“|”通过更改以下语法。此语法可能仅保留给以逗号分隔的文件。你会推荐什么?

    If j = rng.Columns.Count Then
    Write #1, cellValue Else
    Write #1, cellValue,
    
  2. 不必要的引用:在上面提供的同一位中,我使用 Write 而不是 Print。我知道 Print 会去掉引号,但它也会删除分隔符,从而生成制表符分隔的文件,这不是一个选项。管道问题比报价问题具有更高的优先级,但理想情况下我的目标是同时解决这两个问题。

提前感谢您的所有建议。

示例源数据:

【问题讨论】:

    标签: vba excel export delimiter


    【解决方案1】:

    完全同意 Dave 的建议,即使用 FileSystemObject - 它可以在 Microsoft Scripting Runtime 库中找到,您应该将其添加到您的项目中。我的另一个建议是迭代数据的行并为每一行创建一个数组。然后,您可以使用 Join 函数将该数组转换为字符串,其中每个值都使用您选择的分隔符分隔,例如|

    Range 的一行转换为一维数组需要使用Transpose 函数的一个小技巧。它确实使您不必总是检查最后一个字段,并且不会在该迭代中输出分隔符。它还使您不必使用嵌套循环。

    代码如下:

    Option Explicit
    
    Sub Export()
    
        'for file system
        Dim objFs As New FileSystemObject
        Dim tsOut As TextStream
    
        'for data
        Dim rngHeaders As Range
        Dim rngData As Range
        Dim rngRow As Range
        Dim varRowData As Variant
        Dim strRowData As String
        Dim strDelimiter As String
    
        'counters
        Dim lngCounter As Long
    
        'set up data
        Set rngHeaders = Sheet2.Range("A1:F1")
        Set rngData = Sheet2.Range("A3:F10")
    
        'set delimiter
        strDelimiter = "|"
    
        'set up file system
        Set tsOut = objFs.CreateTextFile("c:\temp\out.txt", True)
    
        'output header
        varRowData = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rngHeaders.Value))
        strRowData = VBA.Join(varRowData, strDelimiter)
        tsOut.WriteLine strRowData
    
        'output data
        For lngCounter = 1 To rngData.Rows.Count
            Set rngRow = rngData.Rows(lngCounter)
            varRowData = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rngRow.Value))
            strRowData = VBA.Join(varRowData, strDelimiter)
            tsOut.WriteLine strRowData
        Next lngCounter
    
        'clean up
        tsOut.Close
        Set tsOut = Nothing
        Set objFs = Nothing
    
    End Sub
    

    【讨论】:

    • 这是您给我的即用型解决方案。这个棒极了。我忘了提几个要求。到目前为止我还没有设法解决最后一个: 1.生成的文件名必须是预定义的,并且最好与源电子表格在同一文件夹中; Set tsOut = objFs.CreateTextFile(Application.ThisWorkbook.Path & "/export.txt", True) 2. 分隔符必须出现在行首和行尾:strRowData = "|" & VBA.Join(varRowData, strDelimiter) & "|" 3。我的悬而未决的问题:rngData 参数应该使用一些循环来解释新行
    • 我还用我在网上找到的以下非常简单的语法解决了第三个问题:'for data Dim last As Double Dim rngHeaders As Range Dim rngData As Range Dim rngRow As Range Dim varRowData As Variant Dim strRowData As String Dim strDelimiter As String 'counters Dim lngCounter As Long 'set up data With Sheet13 last = .Cells(.Rows.Count, "G").End(xlUp).Row End With Set rngHeaders = Sheet13.Range("A1:G1") Set rngData = Sheet13.Range("A4:G" & last)
    • 干得好 - 你也可以使用这样的东西:Set rngData = Sheet2.Range(Sheet2.Range("A3"), Sheet2.Cells(Sheet2.Range("A3").End(xlDown).Row, Sheet2.Range("A3").End(xlToRight).Column))
    【解决方案2】:

    使用 FileSystemObject 创建您的文本文件,并在其中写入您喜欢的任何内容:

    Dim oFso : Set oFso = CreateObject("Scripting.FileSystemObject")
    Dim oFile : Set oFile = oFso.CreateTextFile("C:\temp\myfile.txt")
    

    然后你可以使用以下命令编写任何你想要的东西:

    oFile.WriteLine "This will write a line and end it with a vbNewLine"
    oFile.Write "Where this write method will "
    oFile.Write "just write to the file without the new line on the end of the text."
    oFile.WriteLine "You|can|send|pipe|delimited|text|or|whatever|else|you|like"
    oFile.Close 'close and save the updated text file
    

    您可以根据需要通过加倍控制是否发送报价,例如:

    oFile.WriteLine """This is quoted text"""
    

    将在您的文件中打印“这是引用的文本”。

    【讨论】:

    • 感谢@Dave 的建议!很棒的小费。虽然我搜索了很多网站,但我没有发现它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2021-11-12
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多