将Excel文件保存为.txt格式,不带引号

时间:2012-07-16 09:27:24

标签: excel vba excel-vba text

我有一张excel表,其中包含A列中的数据。单元格中有许多特殊字符。当我以.txt格式保存工作表时,我在每行的开头都得到了引号。我尝试手动和宏以.txt格式保存文件。为什么会这样?如何删除它们?  我无法删除 引号。 附加图片enter image description here

8 个答案:

答案 0 :(得分:16)

我看到这个问题已经得到解答,但是想要提供一个替代方案以防其他人稍后发现。

根据所需的分隔符,可以执行此而无需编写任何代码。原始问题没有提供所需输出类型的详细信息,但这里有一个替代方案:

PRN文件类型

最简单的选项是将文件另存为“格式化文本(空格分隔)”类型。 VBA代码行看起来类似于:

ActiveWorkbook.SaveAs FileName:=myFileName, FileFormat:=xlTextPrinter, CreateBackup:=False

在Excel 2007中,这会令人烦恼地在文件名的末尾添加.prn文件扩展名,但可以通过手动重命名将其更改为.txt。

在Excel 2010中,您可以在“另存为”对话框中指定所需的任何文件扩展名。

需要注意的一件重要事项:文本文件中使用的分隔符数量与Excel列的宽度有关。

观察:

Excel Screenshot

变为:

Text Screenshot

答案 1 :(得分:9)

试试这段代码。这就是你想要的。

<强> LOGIC

  1. 将文件另存为用户临时目录中的TAB分隔文件
  2. 在1转
  3. 中阅读文本文件
  4. 用空格替换""并同时写入新文件。
  5. 代码(经过检验和测试)

    Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _
    (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
    
    Private Const MAX_PATH As Long = 260
    
    '~~> Change this where and how you want to save the file
    Const FlName = "C:\Users\Siddharth Rout\Desktop\MyWorkbook.txt"
    
    Sub Sample()
        Dim tmpFile As String
        Dim MyData As String, strData() As String
        Dim entireline As String
        Dim filesize As Integer
    
        '~~> Create a Temp File
        tmpFile = TempPath & Format(Now, "ddmmyyyyhhmmss") & ".txt"
    
        ActiveWorkbook.SaveAs Filename:=tmpFile _
        , FileFormat:=xlText, CreateBackup:=False
    
        '~~> Read the entire file in 1 Go!
        Open tmpFile For Binary As #1
        MyData = Space$(LOF(1))
        Get #1, , MyData
        Close #1
        strData() = Split(MyData, vbCrLf)
    
        '~~> Get a free file handle
        filesize = FreeFile()
    
        '~~> Open your file
        Open FlName For Output As #filesize
    
        For i = LBound(strData) To UBound(strData)
            entireline = Replace(strData(i), """", "")
            '~~> Export Text
            Print #filesize, entireline
        Next i
    
        Close #filesize
    
        MsgBox "Done"
    End Sub
    
    Function TempPath() As String
        TempPath = String$(MAX_PATH, Chr$(0))
        GetTempPath MAX_PATH, TempPath
        TempPath = Replace(TempPath, Chr$(0), "")
    End Function
    

    <强>快照

    实际工作簿

    enter image description here

    保存后

    enter image description here

答案 2 :(得分:6)

嗯,嗯,这个怎么样。

复制您的手机 打开记事本。
糊。

看起来没有引号,没有引号,并且保留了特殊字符,这是OP所要求的。它也是由回车描绘的,与OP没有的附图相同。提到一件坏事(或好事)。

不确定为什么一个简单的答案能够提供理想的结果,这会让我产生负面影响。

答案 3 :(得分:2)

我只是在这个

上花了一个下午的大部分时间

有两种常见的写入文件的方法,第一种是直接文件访问“写”语句。这会添加引号。

第二个是“ActiveWorkbook.SaveAs”或“ActiveWorksheet.SaveAs”,它们都有改变活动工作簿文件名的副作用。

这里的解决方案是我在网上找到的一些解决方案的混合体。它基本上是这样的: 1)将选定的单元格复制到新工作表 2)逐个迭代每个单元格并将其“打印”到打开的文件中 3)删除临时工作表。

该功能适用​​于所选单元格,并为文件名输入字符串或提示输入文件名。

Function SaveFile(myFolder As String) As String
tempSheetName = "fileWrite_temp"
SaveFile = "False"

Dim FilePath As String
Dim CellData As String
Dim LastCol As Long
Dim LastRow As Long

Set myRange = Selection
'myRange.Select
Selection.Copy

'Ask user for folder to save text file to.
If myFolder = "prompt" Then
    myFolder = Application.GetSaveAsFilename(fileFilter:="XML Files (*.xml), *.xml, All Files (*), *")
End If
If myFolder = "False" Then
    End
End If

Open myFolder For Output As #2

'This temporarily adds a sheet named "Test."
Sheets.Add.Name = tempSheetName
Sheets(tempSheetName).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

LastCol = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row

For i = 1 To LastRow
    For j = 1 To LastCol
        CellData = CellData + Trim(ActiveCell(i, j).Value) + "   "
    Next j

    Print #2, CellData; " "
    CellData = ""

Next i

Close #2

'Remove temporary sheet.
Application.ScreenUpdating = False
Application.DisplayAlerts = False
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
'Indicate save action.
MsgBox "Text File Saved to: " & vbNewLine & myFolder
SaveFile = myFolder

结束功能

答案 4 :(得分:1)

我遇到了同样的问题:我必须从excel文件中为银行付款制作一个特定的.txt文件。 .txt文件不能被任何字符分隔,因为标准在每个必填字段后需要一定数量的逗号。 最简单的方法是复制excel文件的副本并将其粘贴到记事本中。

答案 5 :(得分:1)

我使用的是Write#1“打印我的行”,而是尝试使用Print#1“打印我的行”,它为我提供了所有数据,而没有默认Quote(“)

Dim strFile_Path As String
strFile_Path = ThisWorkbook.Path & "\" & "XXXX" & VBA.Format(VBA.Now, "dd-MMM-yyyy hh-mm") & ".txt"
Open strFile_Path For Output As #1

Dim selectedFeature As String

For counter = 7 To maxNumberOfColumn

        selectedFeature = "X"
        Print #1, selectedFeature
        'Write #1, selectedFeature

Next counter
Close #1

答案 6 :(得分:0)

PRN解决方案仅适用于单元格中的简单数据,对我来说,它仅从200个字符单元格中删除前6个符号。

这些是Excel 2007-2016中的主要文件格式, 注意:在Excel for Mac中,值为+1

51 = xlOpenXMLWorkbook (without macro's in 2007-2016, xlsx)
52 = xlOpenXMLWorkbookMacroEnabled (with or without macro's in 2007-2016, xlsm)
50 = xlExcel12 (Excel Binary Workbook in 2007-2016 with or without macro's, xlsb)
56 = xlExcel8 (97-2003 format in Excel 2007-2016, xls)

来自XlFileFormat FileFormat Property

请注意SaveAs method的其他FileFormatNumbers:

FileExtStr = ".csv": FileFormatNum = 6
FileExtStr = ".txt": FileFormatNum = -4158
FileExtStr = ".prn": FileFormatNum = 36

答案 7 :(得分:0)

answer中的this question为这个问题提供了更简单的答案。

  

Write是一个特殊的语句,旨在生成机器可读的   后来被Input占用的文件。

     

使用“打印”以避免对数据的摆弄。

感谢您使用GSerg