忽略了使用vb6从excel中提取的列

我想从excel(2003)电子表格中使用vb6提取值的表,其结果需要存储在(adodb)logging集中。 表格看起来像这样:

    名称选项1选项2选项3选项4选项5选项6 
     -------------------------------------------------- ---------------
    姓名1 2 3 4
     Name2 2 3 4
    姓名3 2 3 4
    姓名4 2 3 4
    姓名5 2 3 4
     Name6 2 3 4
    姓名7 2 3 4
     Name8 2 3 4
     Name9 2 3 4 5 6 7  

在连接并执行查询“ SELECT * FROM [Sheet1$] ”或甚至特定于列的“ SELECT [Option#6] FROM [Sheet1$] ”(请参见脚注1)并循环显示结果时,我会得到NullName9Option.4 – > Option.6的值,而不是正确的值5,6和7.似乎与电子表格的连接正在使用“最佳猜测”来决定有效的表限制,只考虑一定数量的行。

要连接到电子表格,我已经尝试了连接提供程序Microsoft.Jet.OLEDB.4.0MSDASQL并得到相同的问题。

以下是我使用的连接设置:

 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行(不包括列名称)时,才会出现此问题,并且我已经为MSDASQL连接设置了MaxScanRow=0 ,但是这产生了相同的结果。

我列入的重要项目参考资料包括:

  • MS ActiveX数据对象2.8库
  • MS ActiveX数据对象logging集2.8库
  • MS Excel 11.0对象库
  • MS数据绑定收集VB 6.0(SP4)

任何帮助在这个问题将非常感激!

(1)出于某种原因,在列名中包含小数点时,将被解释为#。


感谢大家! 从KB155512 开始试图build立一个Schema.ini “程序化”的一半时, 当优秀的post指出我的解决scheme:

 .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" & filePath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 

我会鼓励任何有类似问题的人阅读post和评论,因为从一个人到另一个人的解决scheme略有差异。

你是正确的:它是基于多行猜测数据types。 有本地计算机registry项您可能会更改以影响所选的数据types。 有关更多详细信息,请参阅此答案 。

默认情况下,Excel ISAM驱动程序会查看您的第一行,并猜测它们的数据types。 如果数据不符合最初的假设(稍后在表格中),它会皱眉并将其变为NULL。

您的MaxScanRows=0设置是这个问题的关键。 这听起来像它会做正确的事情(扫描整个表的数据types使用),但实际上并没有。

看到onedaywhen的答案进一步的细节,我的第一个关于KB282263的信息是不正确的build议。

我可以给你的最好的build议是停止在VB6环境中使用它。 打开Excel,按ALT + F11并加载VBA IDE。 把你的代码放在那里。 在此环境中,您可以访问完整的Excel对象模型。

我看到很多人尝试和用Excel以许多不同的方式进行交互,他们都有问题。 使用VBAmacros或Add-in方法是获得数据的最佳方式。 这就是微软如何将Excel和Project与TFS集成。

有时候,您需要重新思考这个过程,以适应这种方法。 例如,您可能需要让正在使用电子表格的用户运行一个将数据从电子表格中推出的macros,而不是运行一个从电子表格中提取数据的进程,但通常这是相当可行的。