vba - 导出到管道分隔的 .txt 文件(不带引号)

标签 vba excel export delimiter

我创建了一个 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 将删除引号,但它也会删除分隔符,生成制表符分隔的文件,这不是一个选项。管道问题比报价问题具有更高的优先级,但理想情况下我的目标是解决这两个问题。

预先感谢您的所有建议。

示例源数据:
example source data

最佳答案

完全同意 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

关于vba - 导出到管道分隔的 .txt 文件(不带引号),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37784918/

相关文章:

excel - 在 Debug.Print 中返回 5 位日期而不格式化单元格

excel - 是否有类似于 vba 中的 toString() 函数的实现函数?

javascript - 一次将多个数据集导出到Excel()

ms-access - Access Excel导出错误

Mercurial如何为repo中的一个文件创建补丁

vba - 如何在自定义数据验证中使用用户定义的函数?

sql - ms-access 将查询结果保存在一个字符串中

excel - 如何创建制表符分隔的 CSV?

php - 尝试在 Microsoft Excel 中导出带有中文等特殊字符的 csv 但失败

vba - Excel VBA UDF 自动更正错误大小写