使用ADODB连接从closures的工作簿中检索数据。 有些数据被跳过?

我目前正在编写一些代码,可以通过ADODB连接访问单独的工作簿。 我select这个而不是其他方法,因为速度。 这里是我的代码如下:

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 

现在,这个代码主要工作,但是当一行包含混合的数据types时,查询会跳过一些值。 例如:

原始数据:

  3844774 12505604 3844794 12505604 4266113 3281271 4295817 1307HX 

返回的数据:

  3844774 12505604 3844794 12505604 4266113 3281271 4295817 

注意如何跳过最后一个数据位。 对于多个条目来说是这样的,但只有那些包含字母(使其成为文本)的条目才是真实的 原始表格也包含一切设置为文本的内容。 任何build议,以便它不会跳过这些行?

提前致谢!

那是因为你错过了IMEX 🙂

看到这个链接( 章节处理数据为文本

http://connectionstrings.com/excel-2007

从该链接引用。

作为文本处理数据

如果要将文件中的所有数据视为文本,请使用这一项,重写Excels列types“常规”来猜测列中的数据types。

 Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1"; 

如果要将列标题读入结果集(即使有标题,使用HDR = NO),并且列数据为数字,请使用IMEX = 1以避免崩溃。

总是使用IMEX = 1是一种更安全的方式来检索混合数据列的数据。 考虑一个Excel文件可能正常工作的情况,因为该文件的数据会导致驱动程序猜测一种数据types,而另一个包含其他数据的文件会导致驱动程序猜测另一种数据types。 这可能会导致您的应用程序崩溃。

对于XLS文件,请参阅此链接

http://connectionstrings.com/excel

HTH

你应该使用这个。

 OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1"; 

“IMEX = 1;” 告诉驱动程序总是读取“混合”(数字,date,string等)数据列作为文本。 请注意,这个选项可能会影响Excel表单写访问的负面影响。

更多的阅读请阅读。