将CSV(UTF-8)导入Excel而不设置格式
我有将数据从CSV文件粘贴到工作表的代码。一切都很好,但我面临着一些问题,目前的解决方案 有没有一种方法可以按原样粘贴数据而不格式化?现在Excel正在格式化,例如-Name到=-Name,那么还有Name吗?错误而不是值。此外,它正在将215067910018格式化为215068E+11 我的CSV字符串如下所示:将CSV(UTF-8)导入Excel而不设置格式,excel,vba,Excel,Vba,我有将数据从CSV文件粘贴到工作表的代码。一切都很好,但我面临着一些问题,目前的解决方案 有没有一种方法可以按原样粘贴数据而不格式化?现在Excel正在格式化,例如-Name到=-Name,那么还有Name吗?错误而不是值。此外,它正在将215067910018格式化为215068E+11 我的CSV字符串如下所示: 123456,"Word1","Word2","-Word3",,"Word4","Word5","00076",,"Word7","Word8" 运行代码后-Word3看起来像
123456,"Word1","Word2","-Word3",,"Word4","Word5","00076",,"Word7","Word8"
运行代码后-Word3看起来像Name?在Excel单元格中。我得到的是76,而不是00076
这是我目前的代码:
Sub GetCustomers()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets.Add(After:= _
ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
ws.Name = "Sheet1"
Dim strText As String
Dim file As String
file = "L:\15\186507.CSV
' read utf-8 file to strText variable
With CreateObject("ADODB.Stream")
.Open
.Type = 1 ' Private Const adTypeBinary = 1
.LoadFromFile file
.Type = 2 ' Private Const adTypeText = 2
.Charset = "utf-8"
strText = .ReadText(-1) ' Private Const adReadAll = -1
End With
' parse strText data to a sheet
intRow = 1
For Each strLine In Split(strText, Chr(10))
If strLine <> "" Then
With ws
.Cells(intRow, 1) = strLine
.Cells(intRow, 1).TextToColumns Destination:=Cells(intRow, 1), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=True, Space:=False, Other:=False
End With
intRow = intRow + 1
End If
Next strLine
End Sub
编辑:
我可以手动将文本转换为列。VBA是否也能做到这一点?我的意思是设置列数据格式,而.TextToColumns
我曾尝试将目标单元格的格式设置为文本格式,但有时在复制操作上会起作用,但这也没有帮助 这不是一个优雅的解决方案,但在测试时对我很有用,它是在之后更正.TextToColumns操作引入的任何公式。见下文:
Dim cl As Range, rg As Range
作为你的strLineLoop的一部分
可以使用TextToColumns的参数FieldInfo指定数据类型。例如,要为第1列和第4列指定文本,您可以使用以下内容
.Cells(intRow, 1).TextToColumns _
Destination:=.Cells(intRow, 1), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=False, _
Semicolon:=False, _
Comma:=True, _
Space:=False, _
Other:=False, _
FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1), Array(4, 2), Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1))
对于数组中的每一对,第一个数字表示列号,第二个数字表示数据类型1=常规;2=文本;等有关更多详细信息,请查看。TextToColumns方法指定TextQualifier=xlDoubleQuote。类似于双引号中的-Name吗?如果有,这个问题可能会消失?@Cindymister他们用双引号引起来,就像-Word3。但问题仍然存在。如果您使用Excel 2010+中提供的Power Query导入,它会将双引号和imports-Wordn作为文本字符串进行导入。@RonRosenfeld我在考虑过它,但我不确定如果我的CSV不断更新并且出现新行,它将如何工作。每次打开工作簿时都会更新表。我想创建VBS以每天运行此应用程序。因此,它将两个CSV文件导入一个工作簿,将它们连接在一起,并将对象导出到我们的文件管理系统。刷新选项列在“查询属性”对话框窗口中。“打开文件”是选项之一。你也可以使用定时器。如果需要其他触发器,也可以编写VBA事件代码。
.Cells(intRow, 1).TextToColumns _
Destination:=.Cells(intRow, 1), _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=False, _
Semicolon:=False, _
Comma:=True, _
Space:=False, _
Other:=False, _
FieldInfo:=Array(Array(1, 2), Array(2, 1), Array(3, 1), Array(4, 2), Array(5, 1), _
Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1))