2012-05-08 39 views
5

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ę!

+0

Która wersja 'excel' używasz? – jams

Odpowiedz

6

To dlatego, że brakuje IMEX :)

Zobacz ten link (Sekcja Traktowanie danych jako tekst)

http://connectionstrings.com/excel-2007

Cytat ten link.

Leczenie dane jako tekst

użyć tego jeden, jeśli chcesz traktować wszystkie dane w pliku w postaci tekstu, przesłanianie wyróżnia typ kolumny „Ogólne” odgadnąć, jaki typ danych w kolumnie.

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

Jeśli chcesz przeczytać nagłówki kolumn w tabeli wynikowej (przy użyciu HDR = NO chociaż nie jest nagłówek) i danych kolumny jest numeryczne, użyj IMEX = 1 do uniknięcia wypadku.

Aby zawsze używać IMEX = 1 jest bezpieczniejszym sposobem na odzyskanie danych dla kolumn danych mieszanych. Rozważ scenariusz, że jeden plik Excel może działać poprawnie, ponieważ dane pliku powodują, że sterownik zgadywa jeden typ danych, podczas gdy inny plik, zawierający inne dane, powoduje, że sterownik może odgadnąć inny typ danych. Może to spowodować awarię aplikacji.

przypadku plików XLS zobaczyć ten link

http://connectionstrings.com/excel

HTH

+0

Dziękuję bardzo! –

1

ty powinien to wykorzystać.

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

"IMEX = 1"; mówi kierowcy, aby zawsze czytał "wymieszane" (liczby, daty, ciągi itp.) kolumny danych jako tekst. Zauważ, że ta opcja może mieć wpływ na negację zapisu zapisu w programie Excel.

For more reading please read it.

Powiązane problemy