Obecnie piszę kod, który może uzyskać dostęp do oddzielnego skoroszytu za pośrednictwem połączenia ADODB. Wybrałem to zamiast innych metod ze względu na szybkość. Oto mój kod poniżej:Pobieranie danych z zamkniętego skoroszytu przy użyciu połączenia ADODB. Niektóre dane są pomijane?
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
Teraz ten kod najczęściej działa, ale gdy wiersz zawiera mieszane typy danych, zapytanie pominie niektóre wartości. Na przykład:
oryginalne dane:
3844774 12505604
3844794 12505604
4266113 3281271
4295817 1307HX
zwracanych danych:
3844774 12505604
3844794 12505604
4266113 3281271
4295817
Zauważ, że ostatni bit danych jest pomijany. Dotyczy to wielu wpisów, ale tylko tych, które zawierają litery (tworząc tekst). Oryginalna tabela ma wszystko również ustawione na tekst. Wszelkie sugestie, aby nie pomijać tych linii?
Z góry dziękuję!
Która wersja 'excel' używasz? – jams