gpt4 book ai didi

vba - ADO 正在截断 Excel 数据

转载 作者:行者123 更新时间:2023-12-02 11:58:49 27 4
gpt4 key购买 nike

我有一个函数,可以使用 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.0”而不是“0.03”。我认为这是因为第一行中的字符串导致 ADO 将列中的所有值视为显示的字符串。

有没有办法既可以获取文本字符串,又可以获取数值中正确的小数位数?

编辑:刚刚注意到一些奇怪的事情。当我在工作簿打开时运行此命令时,记录集将获得正确的小数位。如果我在工作簿关闭时运行它,它只会获取显示的小数。

最佳答案

针对您的 objRecordset 功能和查询尝试以下操作(在带有 Excel 的 MS Query 中进行测试):

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 format Function强制 ADO 的 SQL 解析器输出格式为 0.00

的字符串

此外,我已将 CursorTLocation 属性设置为 adUseClient,因此您无需使用 MoveLastMoveFirst

让我们知道您的进展

菲利普

关于vba - ADO 正在截断 Excel 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16681618/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com