ADO正在截断Excel数据

时间:2013-05-22 00:26:35

标签: excel vba excel-vba ado jet-sql

我有一个函数,它使用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将列中的所有值视为显示的字符串。

有没有办法我仍然可以获取文本字符串,还可以在数字值中获得正确的小数位数?

编辑:刚发现奇怪的事情。当我在工作簿打开时运行它时,记录集获得正确的小数位。如果我在工作簿关闭时运行它,它只会显示小数点。

2 个答案:

答案 0 :(得分:1)

尝试使用以下 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 Parser输出格式为0.00的字符串

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

让我们知道你是如何进行的

菲利普

答案 1 :(得分:0)

不幸的是,之前我遇到过同样的问题,原因是ACE驱动程序只查看列中的第一个值来确定整个列的数据类型。因此,您可以尝试使用顶部的数值对数据进行排序。

在Excel中创建联接表的“黄金标准”方法是使用vLookup。我建议这样做,即使它看起来有点像“业余爱好者”。

此外,似乎将IMEX设置为1基本上会强制ACE返回文本表示形式,以便数字列中的字母数字值不会返回为空。