您可以通过多种方式引用 Excel 工作簿中的“表格”数据:
- 一个完整的工作表。
- 工作表上的命名单元格区域。
- 工作表上未命名的单元格区域。
Microsoft 知识库文章257819的“使用代码选择 Excel 数据”部分对它们进行了详细说明。
最直接的方法是将数据保存在单独的工作表上,将列名放在第一行(从单元格 A1 开始),然后让实际数据从第 2 行开始,如下所示
为了进行测试,我创建了一个名为“odbcFromExcel”的用户 DSN,它指向该工作簿......
...然后运行以下 VBScript 来测试连接:
Option Explicit
Dim con, rst, rowCount
Set con = CreateObject("ADODB.Connection")
con.Open "DSN=odbcFromExcel;"
Set rst = CreateObject("ADODB.Recordset")
rst.Open "SELECT * FROM [Sheet1$]", con
rowCount = 0
Do While Not rst.EOF
rowCount = rowCount + 1
If rowCount = 1 Then
Wscript.Echo "Data row 1, rst(""LastName"").Value=""" & rst("LastName").Value & """"
End If
rst.MoveNext
Loop
Wscript.Echo rowCount & " data rows found."
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing
结果是
C:\Users\Gord\Documents\__tmp>cscript /nologo excelTest.vbs
Data row 1, rst("LastName").Value="Thompson"
10 data rows found.
我希望这对您的 Excel 连接问题有所帮助。
作为最后的评论,我不得不说,如果您在 Excel 中执行的操作需要“几秒钟”,但在 Access 中执行“大约需要 20-25 分钟”,那么我强烈怀疑您正在以非常低效的方式使用 Access方式,但这是另一个问题的主题(如果你想追求它)。
编辑
如果您想将数据插入 Excel 工作簿,那么这是可能的,但请注意 Excel ODBC 连接的默认设置是“只读”,因此您必须单击“选项>>”按钮并清除该复选框:
完成后,以下代码...
Option Explicit
Dim con
Set con = CreateObject("ADODB.Connection")
con.Open "DSN=odbcFromExcel;"
con.Execute "INSERT INTO [Sheet1$] (ID, LastName, FirstName) VALUES (11, 'Dumpty', 'Humpty')"
con.Close
Set con = Nothing
Wscript.Echo "Done."
...确实会在 Excel 工作表中添加一个包含所提供数据的新行。
但是,这仍然不能解决当您将“嗅探器”应用程序指向 Excel ODBC DSN 时没有可供选择的“表”的问题。
您可以尝试的一件事是在第 1 行创建一个带有列标题的 Excel 工作表,然后选择这些整列并创建一个 Excel“定义名称”。然后,查看您的“嗅探器”应用程序是否将其识别为您可以选择的“表”名称。
FWIW,我在 Excel 工作簿中定义了名称myTable
,=Sheet1!$A:$C
然后我的原始代码在我使用时起作用SELECT * FROM [myTable]
:
C:\Users\Gord\Documents\__tmp>cscript /nologo excelTest.vbs
Data row 1, rst("LastName").Value="Thompson"
1048576 data rows found.
如您所见,它正确检索了第一个“记录”,但随后它无法识别有效数据的结尾并继续读取工作表中的约 100 万行。
我非常怀疑我是否会为此付出更多努力,因为我同意其他评论,即使用 Excel 作为“ODBC 数据库”确实不是一个好主意。
我强烈建议您尝试找出为什么您之前使用 Access 的尝试如此不令人满意。正如我之前所说,在我看来,在与 Access 交互方面做得非常糟糕。