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

时间:2012-05-08 20:46:23

标签: sql excel excel-vba 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

现在,这段代码大多数工作,但是当一行包含混合数据类型时,查询将跳过某些值。例如:

原始数据:

    3844774 12505604
    3844794 12505604
    4266113 3281271
    4295817 1307HX

返回的数据:

    3844774 12505604
    3844794 12505604
    4266113 3281271
    4295817 

注意如何跳过最后一位数据。这适用于多个条目,但仅适用于包含字母(使其成为文本)的条目。原始表格中的所有内容都设置为文本。任何建议,以便它不会跳过这些行?

提前致谢!

2 个答案:

答案 0 :(得分:6)

那是因为你错过了IMEX:)

请参阅此链接(将数据视为文本部分)

http://connectionstrings.com/excel-2007

  

从该链接引用。

     

将数据作为文本处理

     

如果要将文件中的所有数据视为文本,请使用此文件,覆盖Excels列类型“常规”以猜测列中的数据类型。

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文件可能正常工作的情况,因为文件的数据导致驱动程序猜测一种数据类型,而另一个包含其他数据的文件导致驱动程序猜测另一种数据类型。这可能会导致您的应用崩溃。

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

http://connectionstrings.com/excel

HTH

答案 1 :(得分:1)

你应该使用它。

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

" IMEX = 1;"告诉司机总是读"混合" (数字,   日期,字符串等)数据列为文本。请注意,此选项可能   影响excel表写访问否定。

For more reading please read it.