我有一个使用 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 |
+-------+-----------+
然后记录集获得正确的小数点后两位值。但是当我把它们放在这张表中时:
+---------+-----------+
| value | something |
+---------+-----------+
| asdfasd | asdfas |
| 0.0 | a |
| 0.1 | a |
| 0.1 | sda |
| 0.1 | sdf |
+---------+-----------+
那么记录集仅获取小数点后 1 位的值,例如它拾取“0.0”而不是“0.03”。我认为这是因为第一行中的字符串导致 ADO 将列中的所有值视为显示的字符串。
有没有办法我仍然可以拾取文本字符串,但也可以获取数值中正确的小数位数?
编辑:刚刚注意到一些奇怪的事情。当我在工作簿打开时运行此命令时,记录集将获得正确的小数位。如果我在工作簿关闭时运行它,它只会获取显示的小数。