[英]How can I export a txt file from an Excel sheet without having a blank line at the end?
When I export a sheet as txt it generates an empty line at the end.当我将工作表导出为 txt 时,它会在末尾生成一个空行。
I use this code to detect the used range and only export that.我使用这段代码来检测使用的范围并只导出它。 It is necessary to have the workbook with the data to copy open.
必须打开包含要复制的数据的工作簿。
Sub export_range_txt()
Workbooks.Add
y = ActiveWorkbook.Name
'insert the name of the workbook were data is been copied and create this sub there
Windows("original.xlsm").Activate
ActiveSheet.Activate
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
Range("A1:Y" & LastRow).Copy
Windows(y).Activate
ActiveSheet.Activate
Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.DisplayAlerts = False
'change path to desired location of the txt file
ActiveWorkbook.SaveAs Filename:= _
"path\test.txt", FileFormat:=xlText, _
CreateBackup:=False
ActiveWindow.Close
Application.DisplayAlerts = True
End Sub
The following function will export a range to a text file without a blank line at the end.以下 function 会将范围导出到文本文件,最后没有空行。
Function exportRgToTxt(rg As Range, filename As String)
' use a semicolon as a column separator, adjust accordingly or use a parameter
Const SEPARATOR = ";"
Dim i As Long, j As Long
Dim vdat As Variant, vRow As Variant
' Placing the values of the range into an array
vdat = rg.Value
Dim txtFile As Long
txtFile = FreeFile
Open filename For Output As txtFile
' Write each row of the range to the text file but the last one
For i = LBound(vdat, 1) To UBound(vdat, 1) - 1
vRow = Application.WorksheetFunction.Index(vdat, i, 0) ' Get the i-th row of the array
vRow = Join(vRow, SEPARATOR)
Print #txtFile, vRow ' This will add a CRLF at the end of the line
Next i
' Write Last row without an CRLF
vRow = Application.WorksheetFunction.Index(vdat, UBound(vdat, 1), 0)
vRow = Join(vRow, SEPARATOR)
Print #txtFile, vRow; ' the semicolon will avoid the CRLF at the end of the file
Close txtFile
End Function
Be aware, the function will fail in case the range contains a single cell only.请注意,如果范围仅包含单个单元格,则 function 将失败。 One could adjust it but I leave that to the reader.
可以调整它,但我将其留给读者。
That's how you can test it这就是你可以测试它的方式
Sub testit()
exportRgToTxt Range("A1").CurrentRegion, "D:\tmp\abc.txt"
End Sub
Further reading on the Print Statement .进一步阅读打印声明。 Especially the charpos parameter is the one we need here
特别是charpos参数是我们这里需要的
charpos夏波斯
Specifies the insertion point for the next character.指定下一个字符的插入点。 Use a semicolon to position the insertion point immediately after the last character displayed.
使用分号 position 插入点紧跟在最后显示的字符之后。 Use Tab(n) to position the insertion point to an absolute column number.
使用 Tab(n) 将插入点 position 指向绝对列号。 Use Tab with no argument to position the insertion point at the beginning of the next print zone.
使用不带参数的 Tab 到 position 下一个打印区域开头的插入点。 If charpos is omitted, the next character is printed on the next line .
如果省略 charpos,则下一个字符打印在下一行。
See below how one could use the function in the OP's code请参阅下面如何在 OP 代码中使用 function
Sub export_range_txt()
Workbooks.Add
y = ActiveWorkbook.Name
'insert the name of the workbook were data is been copied and create this sub there
Windows("original.xlsm").Activate
ActiveSheet.Activate
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
'Range("A1:Y" & LastRow).Copy ' this line is not needed any longer
' Here you could use the exportRgToTxt instead
exportRgToTxt Range("A1:Y" & LastRow), "<your file name>"
' the remaining code is not neccessary
' Windows(y).Activate
' ActiveSheet.Activate
' Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
'
'
'
' Application.DisplayAlerts = False
' ActiveWorkbook.SaveAs Filename:= _
' 'change path to desired location of the txt file
' "path\test.txt", FileFormat:=xlText, _
' CreateBackup:=False
' ActiveWindow.Close
' Application.DisplayAlerts = True
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.