Workbooks.Open (ActiveWorkbook.Path & "\Test.csv")
不会正确解析csv(在1个单元格中有很多行)
thx to Lernkurve我可以使用他的功能来做对:Opening semicolon delimited CSV file
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
但这并不快(我有数千列的文件),我的问题是:
有没有本地方法在excel中打开csv并正确解析?
答案 0 :(得分:5)
Workbooks.Open
也有效。
Workbooks.Open ActiveWorkbook.Path & "\Temp.csv", Local:=True
这项工作/是必需的,因为我在德国使用Excel并且excel确实使用“,”来默认分隔.csv因为我使用英语安装的windows。即使你使用下面的代码excel强制“,”分隔符。
Workbooks.Open ActiveWorkbook.Path & "\Test.csv", , , 6, , , , , ";"
和Workbooks.Open ActiveWorkbook.Path & "\Temp.csv", , , 4
+这种变体不起作用(!)
如果它被Local参数阻止,为什么他们甚至有delimiter参数?这毫无意义。但现在它有效。
答案 1 :(得分:4)
此功能读取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
答案 2 :(得分:1)
您是否尝试过import text function。
答案 3 :(得分:1)
这可能会对您有所帮助,也取决于您的CSV
文件的格式。
Data
&gt; Import External Data
&gt; Import Data
。CSV
文件。Fixed width
,然后选择Next
。columns
。然后,您可以检查Data preview
面板中的拆分列。Finish
&amp;见。注意:您也可以使用Delimited
作为原始数据类型。
在这种情况下,您需要键入分隔字符。
HTH!
答案 4 :(得分:0)
我遇到同样的问题,我无法在Excel中打开CSV文件。我在这个问题Opening a file in excel via Workbooks.OpenText
中找到了一个对我有用的解决方案这个问题帮助我找出了适合我的代码。代码看起来或多或少像这样:
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
至少,它帮助我了解了我可以使用Workbooks.OpenText
方法使用的大量参数。
答案 5 :(得分:0)
有时,无论设置了多少参数,Workbooks.open的所有解决方案都无法正常工作。 对我来说,最快的解决方案是更改“区域和语言”设置中的列表分隔符。 区域窗口/其他设置... /列表分隔符。
如果csv没有以正确的方式打开,则可能已将','设置为列表分隔符。只需将其更改为“;”一切都解决了。 这是“一切都不利于您”的最简单方法:P