在Excel工作簿中,有几种引用“表格”数据的方法:
- 整个工作表。
- 工作表上已命名的单元格范围。
- 工作表上未命名的单元格范围。
它们在Microsoft知识库文章257819的“使用代码选择Excel数据”部分中有详细解释。
最简单的方法是将数据保留在单独的工作表上,在第一行中放置列名(从单元格A1开始),然后让实际数据从第2行开始,就像这样:
![Excel](https://istack.dev59.com/9vVZB.webp)
为了测试,我创建了一个名为“odbcFromExcel”的用户DSN,指向该工作簿......
![ODBC](https://istack.dev59.com/cwRA1.webp)
......然后运行以下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连接的默认设置是“只读”,所以您需要单击“选项>>”按钮并清除该复选框:
![readonly](https://istack.dev59.com/MnC8F.webp)
完成后,以下代码...
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表格中追加提供的数据并新增一行。
然而,这仍然没有解决当您将“sniffer”应用程序指向Excel ODBC DSN时,无法选择“Tables”的问题。
您可以尝试创建一个带有第一行列标题的Excel工作表,然后选择那些整个列并创建Excel“定义名称”。然后,看看您的“sniffer”应用程序是否将其识别为可选择的“表”名称。
顺便说一下,我在我的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.
你可以看到,它正确地检索了第一个“记录”,但是接着它没有识别到有效数据的结尾,并继续读取表格中的大约一百万行。
我非常怀疑我还会不会再花更多精力在这方面,因为我同意其他评论,使用Excel作为“ODBC数据库”确实不是一个很好的主意。
我强烈建议你尝试找出为什么你之前尝试使用Access如此不令人满意。就像我之前说的那样,听起来好像有些东西与Access交互时做得非常糟糕。