我正在尝试使用vb6从excel(2003)电子表格中提取值表,其结果需要存储在(adodb)记录集中。该表如下所示:
Name Option.1 Option.2 Option.3 Option.4 Option.5 Option.6 ----------------------------------------------------------------- Name1 2 3 4 Name2 2 3 4 Name3 2 3 4 Name4 2 3 4 Name5 2 3 4 Name6 2 3 4 Name7 2 3 4 Name8 2 3 4 Name9 2 3 4 5 6 7
在连接并执行查询“SELECT * FROM [Sheet1$]
”或甚至是特定于列的“SELECT [Option#6] FROM [Sheet1$]
”(参见脚注1)并循环显示结果后,我获得了Null
个值对于行Name9
,Option.4
- > Option.6
而不是正确的值5,6和7.似乎与电子表格的连接使用“最佳猜测”来决定有效表限制是什么,并且只考虑一定数量的行。
要连接到电子表格,我已尝试过两个连接提供商Microsoft.Jet.OLEDB.4.0
和MSDASQL
并遇到同样的问题。
以下是我使用的连接设置:
Set cn = New ADODB.Connection
With cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & filePath & ";Extended Properties=Excel 8.0;"
- - - - OR - - - -
.Provider = "MSDASQL"
.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & filePath & ";MaxScanRows=0;"
.CursorLocation = adUseClient
.Open
End With
Set rsSelects = New ADODB.Recordset
Set rsSelects = cn.Execute("SELECT [Option#5] FROM " & "[" & strTbl & "]")
只有当行数超过8行(列名除外)时才会出现此问题,并且我为MaxScanRow=0
连接设置了MSDASQL
,但这会产生相同的结果。
我所包含的值得注意的项目参考是:
非常感谢任何有关此事的帮助!
(1)由于某种原因,当在列名中包含小数点时,它被解释为#。
谢谢大家!尝试以编程方式设置Schema.ini
“来自KB155512 onedaywhen的优秀post指向解决方案:
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & filePath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
我会鼓励有类似问题的人阅读帖子和评论,因为从一个人到另一个人的解决方案略有不同。
答案 0 :(得分:3)
Excel ISAM驱动程序默认查看第一批行并猜测其数据类型。如果(在表格的后面)数据不符合初始假设,它会皱眉并将其变为NULL。
您的MaxScanRows=0
设置是此问题的关键。听起来它会做正确的事情(扫描整个表格以使用数据类型),但实际上并没有。
有关详细信息,请参阅onedaywhen的答案,我关于KB282263的第一个信息不是正确的建议。
答案 1 :(得分:1)
你是对的:它根据行数猜测数据类型。您可以更改本地计算机注册表项以影响所选的数据类型。有关详细信息,请参阅this answer。
答案 2 :(得分:0)
我能给你的最好建议就是停止在VB6环境中这样做。打开Excel,按ALT + F11并加载VBA IDE。把你的代码放在那里。在此环境中,您可以访问完整的Excel对象模型。
我见过很多人尝试以多种不同的方式与Excel交互,但他们都有问题。使用VBA宏或外接程序方法是我找到获取数据的最佳方法。这就是微软让Excel和Project与TFS集成的方式。
有时候你需要重新考虑一下这个过程是否合适。例如。您可能需要让正在使用电子表格的用户运行一个宏,该宏将数据从电子表格中推出,而不是运行从电子表格中提取数据的过程,但通常这是非常可行的。