如何将每个单独的工作表保存为txt文件

时间:2016-01-06 20:43:29

标签: excel vba excel-vba

我有一个代码可以创建某种格式的工作表,然后我想将其保存为文本文件。我一直在使用Sheet.SaveAs,然后以不同的方式命名文件。是否有更强大的方法来保存文件并移动它们?我目前的代码运行如下:

    OldPath = ThisWorkbook.Path & "\"     ' current path to this workbook
    OldFile = OldPath & ShtName & ".txt"  ' location of file upon creation

    NewPath = OldPath & FldName & "\"     ' path for the folder where file will be moved
    NewFile = NewPath & ShtName & ".txt"  ' location of file after moving
                                                                                             '[3] CREATE INPUT FILES
    ThisWorkbook.Sheets(ShtName).SaveAs OldFile, FileFormat:=xlTextWindows
    ThisWorkbook.SaveAs OldPath & ThisFileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled

    If Len(Dir(NewPath, vbDirectory)) <> 0 And NewPath <> "" Then  'MOVE FILES TO A FOLDER
    Else
        MkDir NewPath  ' create folder for input files to be moved if not yet created
    End If

    If Len(Dir(NewFile)) <> 0 Then  
    ' delete an old version of file if it is already in folder
        SetAttr NewFile, vbNormal
        Kill NewFile
    End If

    Name OldFile As NewFile 

这种方法感觉很麻烦,但我不想使用Shell,因为我觉得它不那么健壮,除非有人推荐使用。

1 个答案:

答案 0 :(得分:1)

您可以使用通用文本打印机和PrintOut方法来实现此目的

首先,如果您还没有,请添加通用文本打印机

  1. Add Printer对话框中,选择File端口
  2. 选择Generic,然后选择Generic / Text Only
  3. 根据需要命名
  4. 此代码将每个工作表发送到此打印机

    Sub SaveWorkbookAsText(wb As Workbook, Optional FldName As String = vbNullString)
        Dim NewPath As String
        Dim GenericTextOnlyPrinter As String
        Dim ws As Worksheet
    
        '<~~~ Change this string to match your Generic Text Only Printer Name
        GenericTextOnlyPrinter = "Text Only (File)"
    
        NewPath = ThisWorkbook.Path & Application.PathSeparator
    
        If FldName <> vbNullString Then
            NewPath = NewPath & FldName
            If Right$(NewPath, 1) <> Application.PathSeparator Then
                NewPath = NewPath & Application.PathSeparator
            End If
        End If
    
        For Each ws In wb.Worksheets
            ws.PrintOut _
              ActivePrinter:=GenericTextOnlyPrinter, _
              PrintToFile:=True, _
              PrToFileName:=NewPath & ws.Name & ".txt", _
              IgnorePrintAreas:=True
        Next
    End Sub
    

    或者,不依赖于打印机,以代码

    生成文件
    Sub SaveWorkbookAsText(wb As Workbook, Optional FldName As String = vbNullString)
        Dim NewPath As String
        Dim ws As Worksheet
        Dim dat As Variant
        Dim rw As Long, cl As Long
        Dim FileNum As Integer
        Dim Line As String
    
        NewPath = ThisWorkbook.Path & Application.PathSeparator
    
        If FldName <> vbNullString Then
            NewPath = NewPath & FldName
            If Right$(NewPath, 1) <> Application.PathSeparator Then
                NewPath = NewPath & Application.PathSeparator
            End If
        End If
    
        For Each ws In wb.Worksheets
            FileNum = FreeFile
            Open NewPath & ws.Name & ".txt" For Output As #FileNum    ' creates the file
    
            dat = ws.UsedRange.Value
            ' in case the sheet contains only 0 or 1 cells
            If TypeName(dat) <> "Variant()" Then
                dat = ws.UsedRange.Resize(, 2)
            End If
    
            For rw = 1 To UBound(dat, 1)
                Line = vbNullString
                For cl = 1 To UBound(dat, 2) - 1
                    Line = Line & dat(rw, cl) & vbTab
                Next
                Print #FileNum, Line & dat(rw, cl)
            Next
            Close #FileNum
        Next
    End Sub