次のように、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 が列のすべての値を表示どおりの文字列として扱っているためだと思います。
テキスト文字列を取得しながら、数値の正しい小数点以下の桁数を取得する方法はありますか?
編集:奇妙なことに気づきました。ワークブックが開いているときにこれを実行すると、レコードセットは正しい小数点以下の桁数を取得します。ワークブックを閉じた状態で実行すると、表示された小数のみが取得されます。