10

我想知道,如何在 Excel 中创建一个数据库表,以便它可以与 ODBC 一起使用

我想使用 ODBC,我有两个选择,MS Access 或 Excel,

您可能知道,为了将某些 MS Access 文件或 Excel 文件指示为 ODBC 源,您需要遵循:

管理工具->数据源(ODBC)->选择用户DSN->从列表中选择“Excel文件”或“MS Access数据库”->按“配置”->最后选择文件(MS Access或Excel)为ODBC 源

好吧,它与 MS Access 配合得很好,我可以连接到文件并查看我在里面创建的所有表

但是说到Excel,虽然可以连接到文件,但是看不到我在里面创建的表格

我只是在“插入”选项卡中使用了“表格”,添加了一些标题作为列名,并给表格一个有意义的名称。这是这样做的方法吗?

4

3 回答 3

14

您可以通过多种方式引用 Excel 工作簿中的“表格”数据:

  • 一个完整的工作表。
  • 工作表上的命名单元格区域。
  • 工作表上未命名的单元格区域。

Microsoft 知识库文章257819的“使用代码选择 Excel 数据”部分对它们进行了详细说明。

最直接的方法是将数据保存在单独的工作表上,将列名放在第一行(从单元格 A1 开始),然后让实际数据从第 2 行开始,如下所示

Excel

为了进行测试,我创建了一个名为“odbcFromExcel”的用户 DSN,它指向该工作簿......

ODBC

...然后运行以下 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 交互方面做得非常糟糕。

于 2013-04-06T10:44:15.157 回答
1

我最近对一些数据也有类似的问题。我设法绕过它的方法是将数据选择为范围 A1:XY12345,然后使用定义名称工具来命名范围。当您通过 ODBC 连接到 Excel 工作簿时,此命名范围将显示为“表格”,而您实际定义(每个 Excel)为表格的范围则不会。

于 2014-03-28T14:50:07.913 回答
-1

您只需从 Excel 文件的第一行中选择尽可能多的列,然后在编辑栏左侧的编辑框中为其命名。当然,您也可以为文件的每一列命名!

于 2015-01-30T14:15:26.663 回答