Eri*_*c F 5 sql excel vba excel-vba
我目前正在编写一些可以通过ADODB连接访问单独工作簿的代码.由于速度的原因,我选择了这个而不是其他方法.这是我的代码如下:
Sub GetWorksheetData(strSourceFile As String, strSQL As String, TargetCell As range)
Dim cn As ADODB.Connection, rs As ADODB.Recordset, f As Integer, r As Long
If TargetCell Is Nothing Then Exit Sub
Set cn = New ADODB.Connection
On Error Resume Next
cn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DriverId=790;ReadOnly=True;" & _
"DBQ=" & strSourceFile & ";"
' DriverId=790: Excel 97/2000
' DriverId=22: Excel 5/95
' DriverId=278: Excel 4
' DriverId=534: Excel 3
On Error GoTo 0
If cn Is Nothing Then
MsgBox "Can't find the file!", vbExclamation, ThisWorkbook.Name
Exit Sub
End If
' open a recordset
Set rs = New ADODB.Recordset
On Error Resume Next
rs.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
' rs.Open "SELECT * FROM [SheetName$]", _
cn, adOpenForwardOnly, adLockReadOnly, adCmdText
' rs.Open "SELECT * FROM [SheetName$]", _
cn, adOpenStatic, adLockOptimistic, adCmdText
' rs.Open "SELECT * FROM [SheetName$] WHERE [Field Name] LIKE 'A%'", _
cn, adOpenStatic, adLockOptimistic, adCmdText
' rs.Open "SELECT * FROM [SheetName$] WHERE [Field Name] LIKE 'A%' ORDER BY [Field Name]", _
cn, adOpenStatic, adLockOptimistic, adCmdText
' optional ways of retrieving a recordset
' Set rs = cn.Execute("[A1:Z1000]") ' first worksheet
' Set rs = cn.Execute("[DefinedRangeName]") ' any worksheet
On Error GoTo 0
If rs Is Nothing Then
MsgBox "Can't open the file!", vbExclamation, ThisWorkbook.Name
cn.Close
Set cn = Nothing
Exit Sub
End If
'RS2WS rs, TargetCell
TargetCell.CopyFromRecordset rs ' optional approach for Excel 2000 or later
If rs.State = adStateOpen Then
rs.Close
End If
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)
现在,这个代码大多数工作,但是当一行包含混合数据类型时,查询将跳过一些值.例如:
原始数据:
3844774 12505604
3844794 12505604
4266113 3281271
4295817 1307HX
Run Code Online (Sandbox Code Playgroud)
返回的数据:
3844774 12505604
3844794 12505604
4266113 3281271
4295817
Run Code Online (Sandbox Code Playgroud)
注意如何跳过最后一位数据.这适用于多个条目,但仅适用于包含字母(使其成为文本)的条目.原始表格中的所有内容都设置为文本.任何建议,以便它不会跳过这些行?
提前致谢!
那是因为你错过了IMEX :)
请参阅此链接(将数据视为文本部分)
http://connectionstrings.com/excel-2007
从那个链接引用.
将数据视为文本
如果要将文件中的所有数据视为文本,请使用此选项,覆盖Excel列类型"常规"以猜测列中的数据类型.
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";
Run Code Online (Sandbox Code Playgroud)
如果要将列标题读入结果集(使用HDR = NO,即使有标题)并且列数据是数字,请使用IMEX = 1以避免崩溃.
始终使用IMEX = 1是检索混合数据列的数据的更安全的方法.考虑一个Excel文件可能正常工作的情况,因为文件的数据导致驱动程序猜测一种数据类型,而另一个包含其他数据的文件导致驱动程序猜测另一种数据类型.这可能会导致您的应用崩溃.
对于XLS文件,请参阅此链接
http://connectionstrings.com/excel
HTH