2016-06-13 108 views
1

我创建了一个VBA代码,可以将数据从单个硬编码工作表导出到export.txt文件。我不得不使用两个For循环,因为我不知道以什么不同(和简单)的方式,我会跳过由导出视角(文件类型和另一个宏的主键)中的不必要信息组成的两行。然而,宏,它的工作...导出到不带引号的管道分隔的.txt文件

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. 不必要的行情:在相同位提供上述我用写的,而不是打印。我知道Print会摆脱引号,但它也会删除生成制表符分隔的文件的分隔符,这不是一个选项。管道问题的优先级高于引号,但理想情况下,我的目标是解决这两个问题。

在此先感谢您的所有建议。

典型源数据:
example source data

回答

0

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

这是您给我的随时可用的解决方案。这个棒极了。我忘了提及一些要求。到目前为止,我还没有设法解决最后一个: 1。生成的文件名必须预先定义,并且与源电子表格位于同一文件夹中; 'Set tsOut = objFs.CreateTextFile(Application.ThisWorkbook.Path&“/export.txt”,True)' 2.分隔符必须出现在行的开始和结尾:'strRowData =“|” &VBA.Join(varRowData,strDelimiter)&“|”' ** 3。我开放的问题:rngData参数应该使用一些循环来解释新行** –

+0

我还用以下语法管理第三个问题,我在网上找到的语法非常简单: ''用于数据 Dim last As Double Dim rngHeaders由于范围 昏暗rngData作为范围 昏暗rngRow作为范围 昏暗varRowData为Variant 昏暗strRowData作为字符串 昏暗strDelimiter作为字符串 “专柜 昏暗lngCounter只要 ”建立数据 随着Sheet13 最后= .Cells (.Rows.Count,“G”)。End(xlUp).Row 结束 Set rngHeaders = Sheet13.Range(“A1:G1”) Set rngData = Sheet13.Range(“A4:G”&last)' –

+0

好的工作 - 你也可以使用像这样的东西:'Set rngData = Sheet2.Range(Sheet2.Range(“A3”),Sheet2.Cells(Sheet2.Range(“A3”)。End(xlDown).Row,Sheet2.Range(“A3”)。End(xlToRight).Column) )' –

1

使用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 

您可以控制是否通过加倍请求报价作为req uired,例如:

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

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

+0

@戴夫感谢您的建议!伟大的提示。即使我搜索了很多网站,但奇迹并没有出现。 –

相关问题