我创建了一个 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
...有两个问题除外:
管道分隔符问题:我无法更改管道“|”的逗号“,”分隔符更改下面的语法。此语法可能仅保留用于逗号分隔的文件。您会推荐什么?
If j = rng.Columns.Count Then Write #1, cellValue Else Write #1, cellValue,
不必要的引号:在上面提供的同一位中,我使用 Write 而不是 Print。我知道 Print 将删除引号,但它也会删除分隔符,生成制表符分隔的文件,这不是一个选项。管道问题比报价问题具有更高的优先级,但理想情况下我的目标是解决这两个问题。
预先感谢您的所有建议。
最佳答案
完全同意 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/