【问题标题】:Error Querying a table using ADODB with VBA in Excel在 Excel 中使用 ADODB 和 VBA 查询表时出错
【发布时间】:2017-03-21 05:26:09
【问题描述】:

我正在尝试使用 SQL 在 Excel 中查询表(购买)。但是,运行以下脚本时出现错误。

tableaddress 变量生成 Purchases!$A$2:$F$1200,这是表“Purchases”的范围。

生成的 SQL 查询是:

Select * From [Purchases!$A$2:$F$1200]

当前的VBA本身如下图:

    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim strSQL As String
    Dim tableAddress As String

    Set cn = New ADODB.Connection
    cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & ActiveWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name

    cn.Open
    tableAddress = "Purchases!" & Range("Purchases").Address
    strSQL = "Select * From [" & tableAddress & "]"
    rs.Open strSQL, cn
    cn.Close

但是,执行时出现以下错误...

[Microsoft][ODBC Excel Driver] 'Purchases!$A$2:$F$1200' is not a valid name.
Make sure that it does not include invalid characters or punctuation and that it is no too long.

我在错误中看到了撇号,但不确定这是否是所指的标点符号,或者如果是,如何去掉它。

谢谢!

【问题讨论】:

  • 你试过没有[]吗?
  • 我有,这会产生“FROM 子句中的语法错误”问题。我最初是这样的,但是在我看到 ADODB 的其他说明中引用的那些之后添加了括号。
  • ActiveWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name 怎么样。您确定ActiveWorkbook 是您认为的那个并且其中有一个Purchases 选项卡吗?还可以尝试限定 SQL 语句中的完整文件路径。 `
  • 我通过将其带到 MsgBox 进行了尝试,并且可以确认它引用了正确的工作簿。我也只是尝试对路径进行硬编码,它产生了相同的结果。这个有点奇怪,因为我过去能够成功地生成这样的 SQL 脚本,但是这个决定让事情复杂化!
  • 是否有理由使用ActiveWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name 而不仅仅是ActiveWorkbook.Fullname?

标签: sql vba excel adodb


【解决方案1】:

以下代码应该可以工作:

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strSQL As String
Dim tableAddress As String

Set cn = New ADODB.Connection
cn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" & ActiveWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name

cn.Open
tableAddress = "Purchases$" & Range("Purchases").Address(False, False)
strSQL = "Select * From [" & tableAddress & "]"
rs.Open strSQL, cn
cn.Close

【讨论】:

  • $ 上的好人。我知道这里有一个我忘记的技巧!
  • @ScottHoltzman - 我必须用谷歌搜索才能找到答案 - 在指定源区域时,我总是使用直线范围名称。
  • 这太完美了!我知道我错过了一些简单的东西。感谢您的帮助!
  • 快速问题,我认为我不需要另一个完整的会话。我将如何适当地为此添加“HDR = No”部分。它一直将表格的第二行注册为第一行,将第一行注册为标题。谢谢!
  • @WSwanson - 使用cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ActiveWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name & ";Extended Properties=""Excel 8.0;HDR=No;"";" 我可以让它返回源范围的第一行......只要该行包含数值。
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 2014-10-03
  • 2014-05-01
  • 2011-01-06
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多