2012-05-08 11 views
5

Actualmente estoy escribiendo un código que puede acceder a un libro de trabajo separado a través de una conexión ADODB. He elegido esto en lugar de otros métodos debido a la velocidad. Aquí está mi código de abajo:Recuperación de datos del libro de trabajo cerrado mediante una conexión ADODB. Algunos datos se saltan?

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 

Ahora, este código funciona en su mayoría sin embargo, cuando una fila contiene los tipos de datos mixtos, la consulta se omita algunos valores. Por ejemplo:

de datos original:

3844774 12505604 
    3844794 12505604 
    4266113 3281271 
    4295817 1307HX 

datos devuelto:

3844774 12505604 
    3844794 12505604 
    4266113 3281271 
    4295817 

Observe cómo se salta el último bit de datos. Esto es cierto para entradas múltiples, pero solo aquellas que contienen letras (por lo que es texto). La tabla original también tiene todo configurado para texto. ¿Alguna sugerencia para que no se salte estas líneas?

¡Gracias de antemano!

+0

¿Qué versión de 'excel' está usando? – jams

Respuesta

6

Eso se debe a que se echa en falta IMEX :)

Vea este enlace (Sección Tratamiento de datos como texto)

http://connectionstrings.com/excel-2007

Presupuesto de ese enlace.

de datos, tratando como texto

Use éste cuando se quiere tratar a todos los datos en el archivo como texto, anulando Sobresale tipo de columna "General" de adivinar qué tipo de datos se encuentran en la columna.

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

Si desea leer los encabezados de columna en el conjunto de resultados (utilizando HDR = NO a pesar de que hay una cabecera) y los datos de la columna es numérico, utilice IMEX = 1 para evitar la colisión.

Usar siempre IMEX = 1 es una forma más segura de recuperar datos para columnas de datos mezclados. Considere la posibilidad de que un archivo de Excel funcione bien porque los datos del archivo hacen que el controlador adivine un tipo de datos, mientras que otro, que contiene otros datos, hace que el controlador adivine otro tipo de datos. Esto puede hacer que tu aplicación se cuelgue.

Para ver archivos XLS este enlace

http://connectionstrings.com/excel

HTH

+0

¡Muchas gracias! –

1

Usted shoud utilizar este.

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

"IMEX = 1;" le dice al conductor que siempre lea las columnas de datos "entremezcladas" (números, fechas, cadenas, etc.) como texto. Tenga en cuenta que esta opción podría afectar el acceso de escritura de hoja de Excel negativo.

For more reading please read it.

Cuestiones relacionadas