5

現在、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 

データの最後のビットがどのようにスキップされるかに注目してください。これは複数のエントリに当てはまりますが、文字を含む (テキストにする) エントリのみです。元のテーブルもすべてテキストに設定されています。これらの行をスキップしないようにするための提案はありますか?

前もって感謝します!

4

2 に答える 2

6

それはあなたがIMEXを見逃しているからです:)

このリンクを参照してください (セクション データをテキストとして扱う)

http://connectionstrings.com/excel-2007

そのリンクから引用します。

データをテキストとして扱う

ファイル内のすべてのデータをテキストとして扱いたい場合にこれを使用し、Excel の列の種類 "General" をオーバーライドして、列のデータの種類を推測します。

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 を使用することは、混合データ列のデータを取得するためのより安全な方法です。1 つの Excel ファイルが正常に動作する可能性があるシナリオを考えてみましょう。ファイルのデータによってドライバーは 1 つのデータ型を推測し、別のデータを含む別のファイルによってドライバーは別のデータ型を推測します。これにより、アプリがクラッシュする可能性があります。

XLS ファイルについては、このリンクを参照してください

http://connectionstrings.com/excel

HTH

于 2012-05-08T20:58:38.843 に答える
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 シートの書き込みアクセス ネガティブに影響を与える可能性があることに注意してください。

さらに読むには、それを読んでください。

于 2012-05-08T20:59:20.317 に答える