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!
¿Qué versión de 'excel' está usando? – jams