Vba 无法使用ADO从CSV读取数据,因为驱动程序认为我使用的是整数/数字,并显示空值而不是文本
我试图使用ADO将一系列文本文件读入工作表。当特定列中的大多数数据都是整数时,我会遇到问题。当到达字符串时,它将在空白单元格中提供空值 根据microsoft支持,这是一个常见的问题,解决方案是将IMEX设置为1。我试过了,但没用 我一直在搜索其他线程来寻找答案,并找到了这个答案,作者说更改TypeGuessRows,让Jet检测是否存在混合类型的情况,并欺骗Jet检测特定的数据类型。然而,这也不起作用 下面是我的VBA代码。任何帮助都将不胜感激Vba 无法使用ADO从CSV读取数据,因为驱动程序认为我使用的是整数/数字,并显示空值而不是文本,vba,excel,ado,adodb,Vba,Excel,Ado,Adodb,我试图使用ADO将一系列文本文件读入工作表。当特定列中的大多数数据都是整数时,我会遇到问题。当到达字符串时,它将在空白单元格中提供空值 根据microsoft支持,这是一个常见的问题,解决方案是将IMEX设置为1。我试过了,但没用 我一直在搜索其他线程来寻找答案,并找到了这个答案,作者说更改TypeGuessRows,让Jet检测是否存在混合类型的情况,并欺骗Jet检测特定的数据类型。然而,这也不起作用 下面是我的VBA代码。任何帮助都将不胜感激 Sub query_text_file(Work
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
基本上,不要像前面解释的那样依赖注册表项 您需要创建一个Schema.ini文件,并将其与所有文本文件放在同一文件夹中。在Schema.ini中,您可以为文本文件中的所有列指定类型-显式指定类型比让驱动程序为列指定正确类型更安全 假设桌面上有一些txt文件,打开记事本并复制粘贴下面的内容-确保调整[test.txt]部分以匹配实际txt文件的名称,并将其另存为:Schema.ini 确保在文章中指出的strPath中的parth末尾添加另一个斜杠 *请记住,我在与您不同的位置工作-我在本例中使用的是我的桌面,我的文本文件名为test.txt 现在,您已经有了Schema.ini,您可以修改连接字符串并取出一些不需要的参数,因为它们存在于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
现在运行此命令后,您应该会看到所有值,包括缺少的p:
谢谢你的回复。关于Schema.ini文件。如果我有多个大小不一的文本文件,我该如何修改它?@user2755399看看这篇文章——我的答案是基于这篇文章的。你真是太棒了!工作得很漂亮!
strPath = ThisWorkbook.Path & "\Excel_Barcode_Files\"
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