我正在使用 VBA 将[此 CSV][1] 加载到 Excel。 我正在使用 [CSV Lint][2] 验证 CSV,但出现三个换行错误。
我的代码是:
Dim ws As Worksheet
Set ws = ActiveSheet
Dim fileName As String, folder As String
folder = ThisWorkbook.Path & "\"
fileName = Dir(ThisWorkbook.Path & "\*.csv")
ActiveCell.Offset(1, 0).Range("A6").Select
With ActiveSheet.QueryTables _
.Add(Connection:="TEXT;" & folder & fileName , Destination:=ActiveCell)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 850
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=True
End With
是否可以在不将 CSV 文件修改为新文件的情况下删除换行符? 我尝试了很多宏,但似乎没有任何效果。
如果我必须将 CSV 修改为新的,我有以下代码:
Dim fso As Object, tsIn, tsOut
Dim s As String
Dim filePath As String
Dim newCSV As String
filePath = folder & fileName
newCSV = folder & "report.csv"
Set fso = CreateObject("Scripting.Filesystemobject")
Set tsIn = fso.OpenTextFile(filePath, 1)
Set tsOut = fso.CreateTextFile(newCSV, 1)
Do While tsIn.AtEndOfLine <> True
s = tsIn.readline
s = Replace(s, vbCrLf, "")
tsOut.write s
Loop
tsIn.Close
tsOut.Close
Kill filePath
但它会删除 CSV 文件中的所有换行符。
如何搜索影响我的 Excel 的换行符?
将 CSV 作为工作簿打开,并将数据复制到活动工作表中。任何带引号的换行符都会出现在单元格内。
Option Explicit
Sub loadcsv()
Dim ws As Worksheet, wbCSV As Workbook, n As Long
Dim fileName As String, folder As String
folder = ThisWorkbook.Path & "\"
fileName = Dir(folder & "*.csv")
Set ws = ActiveSheet
Set wbCSV = Workbooks.Open(folder & fileName, False, True)
With wbCSV.Sheets(1)
n = .UsedRange.Rows.Count
.UsedRange.Copy ws.Range("A7")
End With
wbCSV.Close False
ws.Columns("A:T").AutoFit
ws.Rows("7").Resize(n).AutoFit
MsgBox n & " rows loaded from " & folder & fileName, vbInformation
End Sub
- 以 (
) 个字符结尾的 MS-DOS 样式行(最后一行可选)。CR/LF
这已在 您的 CSS Linter 中得到确认,位于 “如何编写 CSV”部分。
(另请参阅“常见错误”部分。)
行结尾使用
(Windows 行结尾),列名称和字段以逗号分隔。CRLF
您的代码似乎正在删除 CRLF。
您的示例 CSV 似乎使用 LF(根据我从您的链接复制/粘贴到 Notepad++ 并转到“查看→显示符号→显示所有字符”。
因此,我认为您需要将
Replace
行替换为:
s = Replace(s, vbLf, vbCrLf)
就像@CDP1802所说和@sdplus建议一样,有一些解决方法意味着更多的工作量,但它确实可以完成工作。 我的方法是在 Excel 中粘贴 CSV 格式的字符串时触发自动解析。当您在文本编辑器中手动打开 CSV、复制内容并将其粘贴到 Excel 工作表中时,行为是相同的。
Sub LoadFileAsWorksheet(ByVal filePath As String, ByVal sheetName As String)
Dim csvSheet As Worksheet
Dim fileContent As String
' Read the file content as UTF-8
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile filePath
fileContent = .ReadText
.Close
End With
' Create a new worksheet and set its name
Set csvSheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
csvSheet.Name = sheetName
' Copy the content to the clipboard
With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
.SetText fileContent
.PutInClipboard
End With
' Paste the content into the new worksheet
csvSheet.Paste csvSheet.Range("A1")
End Sub