通过VBA打开csv文件(性能)
显然这个问题已经被问了很多次了。 正常程序:
Workbooks.Open (ActiveWorkbook.Path & "\Test.csv")
不会正确parsingcsv(在1单元格中有很多行)
thx Lernkurve我可以使用他的function得到它的权利: 打开分号分隔的CSV文件
Sub ImportCSVFile(filepath As String) Dim line As String Dim arrayOfElements Dim linenumber As Integer Dim elementnumber As Integer Dim element As Variant linenumber = 0 elementnumber = 0 Open filepath For Input As #1 ' Open file for input Do While Not EOF(1) ' Loop until end of file linenumber = linenumber + 1 Line Input #1, line arrayOfElements = Split(line, ";") elementnumber = 0 For Each element In arrayOfElements elementnumber = elementnumber + 1 Cells(linenumber, elementnumber).Value = element Next Loop Close #1 ' Close file. End Sub
然而,这不是很快(我有成千上万的文件列),我的问题是:
是否有任何本地的方式来打开正确parsingExcel中的CSV?
Workbooks.Open
也可以工作。
Workbooks.Open ActiveWorkbook.Path & "\Temp.csv", Local:=True
这工作/是需要的,因为我在德国使用Excel和Excel使用“,”默认分开.csv,因为我使用英语安装的Windows。 即使你使用下面的代码强制使用“,”分隔符。
Workbooks.Open ActiveWorkbook.Path & "\Test.csv", , , 6, , , , , ";"
和Workbooks.Open ActiveWorkbook.Path & "\Temp.csv", , , 4
+这个变种不起作用(!)
为什么他们甚至有分隔符参数,如果它被本地参数阻止?! 这完全没有意义。 但现在它的工作。
该function读取15MB的CSV文件,并在约3秒内将其内容复制到一张纸上。 代码中可能花费了大量时间的是,您将逐个单元格复制数据,而不是将整个内容一次性复制。
Option Explicit Public Sub test() copyDataFromCsvFileToSheet "C:\temp\test.csv", ",", "Sheet1" End Sub Private Sub copyDataFromCsvFileToSheet(parFileName As String, parDelimiter As String, parSheetName As String) Dim data As Variant data = getDataFromFile(parFileName, parDelimiter) If Not isArrayEmpty(data) Then With Sheets(parSheetName) .Cells.ClearContents .Cells(1, 1).Resize(UBound(data, 1), UBound(data, 2)) = data End With End If End Sub Public Function isArrayEmpty(parArray As Variant) As Boolean 'Returns false if not an array or dynamic array that has not been initialised (ReDim) or has been erased (Erase) If IsArray(parArray) = False Then isArrayEmpty = True On Error Resume Next If UBound(parArray) < LBound(parArray) Then isArrayEmpty = True: Exit Function Else: isArrayEmpty = False End Function Private Function getDataFromFile(parFileName As String, parDelimiter As String, Optional parExcludeCharacter As String = "") As Variant 'parFileName is supposed to be a delimited file (csv...) 'parDelimiter is the delimiter, "," for example in a comma delimited file 'Returns an empty array if file is empty or can't be opened 'number of columns based on the line with the largest number of columns, not on the first line 'parExcludeCharacter: sometimes csv files have quotes around strings: "XXX" - if parExcludeCharacter = """" then removes the quotes Dim locLinesList() As Variant Dim locData As Variant Dim i As Long Dim j As Long Dim locNumRows As Long Dim locNumCols As Long Dim fso As Variant Dim ts As Variant Const REDIM_STEP = 10000 Set fso = CreateObject("Scripting.FileSystemObject") On Error GoTo error_open_file Set ts = fso.OpenTextFile(parFileName) On Error GoTo unhandled_error 'Counts the number of lines and the largest number of columns ReDim locLinesList(1 To 1) As Variant i = 0 Do While Not ts.AtEndOfStream If i Mod REDIM_STEP = 0 Then ReDim Preserve locLinesList(1 To UBound(locLinesList, 1) + REDIM_STEP) As Variant End If locLinesList(i + 1) = Split(ts.ReadLine, parDelimiter) j = UBound(locLinesList(i + 1), 1) 'number of columns If locNumCols < j Then locNumCols = j i = i + 1 Loop ts.Close locNumRows = i If locNumRows = 0 Then Exit Function 'Empty file ReDim locData(1 To locNumRows, 1 To locNumCols + 1) As Variant 'Copies the file into an array If parExcludeCharacter <> "" Then For i = 1 To locNumRows For j = 0 To UBound(locLinesList(i), 1) If Left(locLinesList(i)(j), 1) = parExcludeCharacter Then If Right(locLinesList(i)(j), 1) = parExcludeCharacter Then locLinesList(i)(j) = Mid(locLinesList(i)(j), 2, Len(locLinesList(i)(j)) - 2) 'If locTempArray = "", Mid returns "" Else locLinesList(i)(j) = Right(locLinesList(i)(j), Len(locLinesList(i)(j)) - 1) End If ElseIf Right(locLinesList(i)(j), 1) = parExcludeCharacter Then locLinesList(i)(j) = Left(locLinesList(i)(j), Len(locLinesList(i)(j)) - 1) End If locData(i, j + 1) = locLinesList(i)(j) Next j Next i Else For i = 1 To locNumRows For j = 0 To UBound(locLinesList(i), 1) locData(i, j + 1) = locLinesList(i)(j) Next j Next i End If getDataFromFile = locData Exit Function error_open_file: 'returns empty variant unhandled_error: 'returns empty variant End Function
这可以帮助你,也取决于你的CSV
文件是如何形成的。
- 打开您的Excel表格,并进入菜单
Data
>Import External Data
>Import Data
。 - select你的
CSV
文件。 - 原始数据types:select
Fixed width
,然后selectNext
。 - 它会自动分隔你的
columns
。 那么您可以在“Data preview
面板中查看拆分的列。 - 然后
Finish
看看。
注意:您也可以使用Delimited
为原始数据types。 在这种情况下,您需要键入您的分隔字符。
HTH!
你有没有尝试导入文本function 。
我有同样的问题,我无法在Excel中打开一个CSV文件。 我发现了一个解决scheme,在这个问题上为我工作在Excel中打开文件通过Workbooks.OpenText
这个问题帮我找出了一个适合我的代码。 代码看起来或多或less像这样:
Private Sub OpenCSVFile(filename as String) Dim datasourceFilename As String Dim currentPath As String datasourceFilename = "\" & filename & ".csv" currentPath = ActiveWorkbook.Path Workbooks.OpenText Filename:=currentPath & datasourceFilename, _ Origin:=xlWindows, _ StartRow:=1, _ DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, _ Tab:=False, _ Semicolon:=False, _ Comma:=True, _ Space:=False, _ Other:=False, _ FieldInfo:=Array(Array(1, 1), Array(2, 1)), _ DecimalSeparator:=".", _ ThousandsSeparator:=",", _ TrailingMinusNumbers:=True End Sub
至less,它帮助我了解了许多可以使用Workbooks.OpenText
方法的参数。