4

次のように、ADO を使用してワークシートの内容から ADODB レコードセットを取得する関数があります。

Function WorksheetRecordset(workbookPath As String, sheetName As String) As adodb.Recordset

Dim objconnection As New adodb.Connection
Dim objrecordset As New adodb.Recordset

On Error GoTo errHandler

Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H1

objconnection.CommandTimeout = 99999999

objconnection.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=" & workbookPath & ";" & _
        "Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"

objrecordset.Open "Select * FROM [" & sheetName & "$]", _
    objconnection, adOpenStatic, adLockOptimistic, adCmdText

If objrecordset.EOF Then
    Set WorksheetRecordset = Nothing
    Exit Function
End If

objrecordset.MoveLast
objrecordset.MoveFirst

Set WorksheetRecordset = objrecordset
Exit Function

errHandler:
Set WorksheetRecordset = Nothing

End Function

数値が小数点以下 1 桁にフォーマットされている数値データのインポートで問題が発生していますが、実際には小数点以下 2 桁です。これは、列にデータ型が混在している場合にのみ発生します。たとえば、次の値です。

0.03
0.05
0.08
0.13

このテーブルで小数点以下 1 桁に設定すると、次のようになります。

+-------+-----------+
| value | something |
+-------+-----------+
| 0.0   | a         |
| 0.1   | a         |
| 0.1   | sda       |
| 0.1   | sdf       |
+-------+-----------+

次に、レコードセットは正しい小数点以下 2 桁の値を取得します。しかし、それらをこの表に入れると、次のようになります。

+---------+-----------+
|  value  | something |
+---------+-----------+
| asdfasd | asdfas    |
| 0.0     | a         |
| 0.1     | a         |
| 0.1     | sda       |
| 0.1     | sdf       |
+---------+-----------+

その場合、レコードセットは小数点以下 1 桁の値のみを取得します。たとえば、「0.03」ではなく「0.0」を取得します。これは、最初の行の文字列が原因で、ADO が列のすべての値を表示どおりの文字列として扱っているためだと思います。

テキスト文字列を取得しながら、数値の正しい小数点以下の桁数を取得する方法はありますか?

編集:奇妙なことに気づきました。ワークブックが開いているときにこれを実行すると、レコードセットは正しい小数点以下の桁数を取得します。ワークブックを閉じた状態で実行すると、表示された小数のみが取得されます。

4

2 に答える 2

1

objRecordsetの機能とクエリについて以下を試してください( MS Query with Excel でテスト済み):

With objrecordset
    .CursorLocation = adUseClient
    .LockType = adLockOptimistic
    .CursorType = adOpenStatic
    .ActiveConnection = objconnection
    .Open "Select format(`" & sheetName & "$`.value,'0.00') as [value], something FROM [" & sheetName & "$]"
End With

したがって、ここでJET SQL フォーマット関数は、ADO の SQL パーサーに次のようにフォーマットされた文字列を出力するように強制しています。0.00

CursorTLocationまた、プロパティをに設定したadUseClientので、使用する必要はありませMoveLastMoveFirst

乗り方を教えてください

フィリップ

于 2013-05-22T13:36:14.623 に答える