我有一个代码可以创建某种格式的工作表,然后我想将其保存为文本文件。我一直在使用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,因为我觉得它不那么健壮,除非有人推荐使用。
答案 0 :(得分:1)
您可以使用通用文本打印机和PrintOut
方法来实现此目的
首先,如果您还没有,请添加通用文本打印机
Add Printer
对话框中,选择File
端口Generic
,然后选择Generic / Text Only
此代码将每个工作表发送到此打印机
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