使用vb6忽略列以从excel中提取

时间:2008-10-23 11:35:07

标签: excel vb6 oledb adodb msdasql

我正在尝试使用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个值对于行Name9Option.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行(列名除外)时才会出现此问题,并且我为MaxScanRow=0连接设置了MSDASQL,但这会产生相同的结果。

我所包含的值得注意的项目参考是:

  • MS ActiveX数据对象2.8库
  • MS ActiveX数据对象Recordset 2.8库
  • MS Excel 11.0对象库
  • MS Data Binding Collection VB 6.0(SP4)

非常感谢任何有关此事的帮助!

(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"";"

我会鼓励有类似问题的人阅读帖子和评论,因为从一个人到另一个人的解决方案略有不同。

3 个答案:

答案 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集成的方式。

有时候你需要重新考虑一下这个过程是否合适。例如。您可能需要让正在使用电子表格的用户运行一个宏,该宏将数据从电子表格中推出,而不是运行从电子表格中提取数据的过程,但通常这是非常可行的。