use*_*399 4 excel vba ado adodb excel-vba
我正在尝试使用ADO将一系列文本文件读入工作表.当特定列中的大多数数据是整数时,我遇到了问题.当它到达String时,它将给出空值(空白单元格).
根据微软支持(Ado混合数据tyes)这是一个常见的事情,解决方案是设置IMEX = 1.我试过这个,但它不起作用.
我一直在寻找寻找答案的其他线程,并且遇到了这个答案(其他线程),作者说要TypeGuessRows改为"让Jet检测是否存在混合类型情况并欺骗Jet检测某种数据类型." 但是,这也没有奏效.
以下是我的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
Run Code Online (Sandbox Code Playgroud)
这是一个示例文本文件.代码读入除"P"之外的所有内容
test test
P,0
1,1
5,2
6,3
Run Code Online (Sandbox Code Playgroud)
小智 6
基本上,不要依赖于MSDN上解释的注册表项.
您需要创建一个Schema.ini文件并将其放在与所有文本文件相同的文件夹中.在Schema.ini你指定文本文件中可能包含的所有列的类型 - 这只是一个更明智的选择,而不是让驱动程序计算出列的正确类型...
假设桌面上有一些txt文件,打开记事本并复制下面的粘贴 - 确保调整[test.txt]部件以匹配实际txt文件的名称并将其保存为:Schema.ini
[test.txt]
Format=CSVDelimited
Col1=Column1 Text
Col2=Column2 Text
Run Code Online (Sandbox Code Playgroud)
确保在parth的末尾添加另一个斜杠strPath(也在文章中指出)
strPath = ThisWorkbook.Path & "\Excel_Barcode_Files\"
Run Code Online (Sandbox Code Playgroud)
*请记住,我在与您不同的位置工作 - 我正在使用我的桌面作为此示例,我的文本文件已命名 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
Run Code Online (Sandbox Code Playgroud)
现在运行之后你应该看到包括缺失的所有值P:
