由于驱动程序认为我使用整数/数字并显示空值而不是文本,所以无法使用ADO从CSV读取数据

我正在尝试使用ADO将一系列文本文件读入工作表中。 当特定列中的大多数数据是整数时,我遇到了问题。 当它到达一个string时,它会给出空值(空白单元格)。

根据微软的支持( Ado混合数据tyes )这是一个常见的事情,解决的办法是设置IMEX = 1 。 我试过这个,但它没有工作。

我一直在寻找其他线程寻找答案,碰到这个答案( 其他线程 )作者说,改变TypeGuessRows “让Jet检测是否存在混合types的情况,并诱使Jet检测到某种数据types。 “ 但是,这也没有奏效。

以下是我的VBA代码。 任何帮助,将不胜感激

 Sub query_text_file(WorkingSheet As String, Col As String, Row As Integer, fileName As String, firstOrLast As Integer) Dim strPath As String Dim ws As Worksheet strToolWkbk = fileName strPath = ThisWorkbook.Path & "\Excel_Barcode_Files" Set ws = Worksheets(WorkingSheet) 'Need to reference the: ' Microsoft ActiveX Data Objects 2.5 Library Dim s_rst As ADODB.Recordset Dim s_cnn As ADODB.Connection 's for sub connection Dim intRow As Integer Const adOpenStatic = 3 Const adLockOptimistic = 3 Const adCmdText = &H1 Set s_cnn = New ADODB.Connection s_cnn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strPath & ";" _ & "Extended Properties=""text;HDR=Yes;IMEX=1;TypeGuessRows=12;FMT=Delimited"";" s_cnn.Open Set s_rst = New ADODB.Recordset strSQL = "SELECT * FROM " & strToolWkbk s_rst.Open strSQL, _ s_cnn, adOpenStatic, adLockOptimistic, adCmdText intRow = Row s_rst.MoveFirst Do Until s_rst.EOF ws.Range(Col & intRow) = s_rst(0) ws.Range(Chr(Asc(Col) + 1) & intRow) = s_rst(1) intRow = intRow + 1 s_rst.MoveNext Loop s_rst.Close s_cnn.Close Set s_rst = Nothing Set s_cnn = Nothing End Sub 

这是一个示例文本文件。 代码读取除了“P”

 test test P,0 1,1 5,2 6,3 

基本上,不要像MSDN上的解释那样依赖registry项。

您需要创build一个Schema.ini文件并将其放在与所有文本文件相同的文件夹中。 在Schema.ini ,您可以为文本文件中的所有列指定types – 显式执行操作只是一个更为安全的select,而不是让驱动程序为列创build正确的types。

假设你的桌面上有一些txt文件,打开记事本并复制粘贴下面的内容 – 确保你调整了[test.txt]部分以匹配你实际的txt文件的名字,并保存为: Schema.ini

 [test.txt] Format=CSVDelimited Col1=Column1 Text Col2=Column2 Text 

确保在partPath的结尾处添加另一个斜杠( 也在文章中指出

 strPath = ThisWorkbook.Path & "\Excel_Barcode_Files\" 

*请记住,我正在与您的不同位置工作 – 我正在使用我的桌面为这个例子,我的文本文件被命名为test.txt

现在,你有一个Schema.ini你可以修改连接string,并取出一些不需要的参数,因为它们存在于Schema.ini

基于上述假设,SSCCE基本上是:

 Sub Main() Cells.ClearContents Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim thePath As String thePath = "C:\Users\" & Environ("USERNAME") & "\Desktop\" cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & thePath & ";" _ & "Extended Properties=""text;HDR=No;""" cn.Open Dim sql As String sql = "SELECT * FROM test.txt" ' populate the recordset rs.Open sql, cn, adOpenStatic, adLockOptimistic, &H1 ' copy the recordset starting at Range("A1") - assuming there are no headers - see HDR = No; Range("A1").CopyFromRecordset rs rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub 

现在运行后,你应该看到所有的值,包括缺less的P

在这里输入图像描述