问题
I tied Save As
my sheet in CSV format with (Comma Delimited) "," for fields and {CR}{LF} for records in line by below code.
The issue is:
1) Generated file is delimited by ";" sign instead of ",".
2) Be sure records are separated by {CR}{LF}
3) How can define encoding as Unicode UTF-8 (in situation if needed)
I want this file have save by .txt extension.
How can I generate CSV file in true format by above situation?
Sub GenCSV()
Dim NewBook As Workbook
Set NewBook = Workbooks.Add
ThisWorkbook.Worksheets("Sheet1").Range("tblTaxRep[[Header1]: _
[Headern]]").SpecialCells(xlCellTypeVisible).Copy
With NewBook
.Worksheets("Sheet1").Cells(1, 1).PasteSpecial (xlPasteValues)
.SaveAs Filename:=ThisWorkbook.Path & "Report" & ".txt", FileFormat:=xlCSV
.Close SaveChanges:=False
End With
End Sub
回答1:
Saddly, the answer may not be what you expect. The issues that you are experiencing are all related to the .SaveAs method, which has standard file structures. Excel seems unable to save the files in your specified format, particularly as CSV's in UTF-8. The following posts may help you find a solution:
Excel to CSV with UTF8 encoding
Is it possible to force Excel recognize UTF-8 CSV files automatically?
回答2:
Option Explicit
Const strDelimiter = """"
Const strDelimiterEscaped = strDelimiter & strDelimiter
Const strSeparator = ","
Const strRowEnd = vbCrLf
Const strCharset = "utf-8"
Function CsvFormatString(strRaw As String) As String
Dim boolNeedsDelimiting As Boolean
boolNeedsDelimiting = InStr(1, strRaw, strDelimiter) > 0 _
Or InStr(1, strRaw, Chr(10)) > 0 _
Or InStr(1, strRaw, strSeparator) > 0
CsvFormatString = strRaw
If boolNeedsDelimiting Then
CsvFormatString = strDelimiter & _
Replace(strRaw, strDelimiter, strDelimiterEscaped) & _
strDelimiter
End If
End Function
Function CsvFormatRow(rngRow As Range) As String
Dim arrCsvRow() As String
ReDim arrCsvRow(rngRow.Cells.Count - 1)
Dim rngCell As Range
Dim lngIndex As Long
lngIndex = 0
For Each rngCell In rngRow.Cells
arrCsvRow(lngIndex) = CsvFormatString(rngCell.Text)
lngIndex = lngIndex + 1
Next rngCell
CsvFormatRow = Join(arrCsvRow, ",") & strRowEnd
End Function
Sub CsvExportRange( _
rngRange As Range, _
Optional strFileName As Variant _
)
Dim rngRow As Range
Dim objStream As Object
If IsMissing(strFileName) Or IsEmpty(strFileName) Then
strFileName = Application.GetSaveAsFilename( _
InitialFileName:=ActiveWorkbook.Path & "\" & rngRange.Worksheet.Name & ".csv", _
FileFilter:="CSV (*.csv), *.csv", _
Title:="Export CSV")
End If
Set objStream = CreateObject("ADODB.Stream")
objStream.Type = 2
objStream.Charset = strCharset
objStream.Open
For Each rngRow In rngRange.Rows
objStream.WriteText CsvFormatRow(rngRow)
Next rngRow
objStream.SaveToFile strFileName, 2
objStream.Close
End Sub
Sub CsvExportSelection()
CsvExportRange ActiveWindow.Selection
End Sub
Sub CsvExportSheet(varSheetIndex As Variant)
Dim wksSheet As Worksheet
Set wksSheet = Sheets(varSheetIndex)
CsvExportRange wksSheet.UsedRange
End Sub
Reference
来源:https://stackoverflow.com/questions/45189564/how-can-defining-fields-delimiter-character-encoding-and-records-seperator-cr