【问题标题】:Importing data from SQL database in Excel 2003 VS Excel 2010 (VBA)在 Excel 2003 VS Excel 2010 (VBA) 中从 SQL 数据库导入数据
【发布时间】:2010-10-13 18:30:09
【问题描述】:

所以,我的公司终于升级到 MS Office 2010。到目前为止,我一直在 2003 年工作。我是一名 SQL 程序员,我经常在 Excel 中创建报告,从我们的数据库中提取数据。大多数时候,我会创建宏来接受用户将在特定单元格中键入的参数,更改查询,然后根据参数刷新它。

这是一个非常简单的例子:

  1. 在 Excel 2003 中,我将打开一个新工作簿。
  2. 单击“数据”,然后单击“导入外部数据”,然后单击“新建数据库查询”。
  3. 然后它会提示您选择一个数据源,所以我会选择我想从中查询的数据库(已经设置了 ODBC 连接)。
  4. 然后我取消查询向导窗口,然后当我在 Microsoft 查询编辑器中时,我只需输入我的查询。

    • 为简单起见,我将从名为 Agents 的表中选择 *,该表只是为公司工作的代理及其 EmployeeIds 的列表。

    • select * from Agents

  5. 然后我“x”退出查询编辑器,弹出一个名为“导入数据”的框,询问您要将数据放在哪里:在现有工作表中?一个新的工作表?等等。我只是让它返回现有工作表中的数据,从 Cell A2

然后我在 Visual Basic 编辑器中的工作簿模块中编写了这个简单的宏:

Sub Refresh()

Dim oQuery as QueryTable
Dim oAgent as String

set oQuery = Sheet1.QueryTables(1)

oAgent = Sheet1.Range("A1")

oQuery.CommandText = "select * from Agents where Agent = '"+oAgent+"'"
oQuery.Refresh

End Sub

我创建了一个运行此宏的按钮并将其粘贴在B1 中。因此,用户打开报告,在A1 中输入名称,点击按钮,该代理及其 ID 出现在下表中。真的很简单吧?但我无法让它在 Excel 2010 中工作。

这是我的步骤和以下错误:

  1. 我打开 Excel 2010,然后转到“数据”选项卡。
  2. 在“获取外部数据”部分下,单击“来自其他来源”并从下拉列表中选择“来自 Mircrosoft 查询”。
  3. 然后弹出Choose Data Source框,和上面的步骤3,4,5基本一样。

然后我编写相同的宏,创建按钮并将其分配给宏,但是当我单击按钮时出现以下错误:

Run-time error '9':
Subscript out of range

我点击调试,调试器突出显示这一行

Set oQuery = Sheet1.QueryTables(1)

我试着让这条线更具体,像这样:

Set oQuery = WorkBooks("Book 1").Sheets("Sheet 1").QueryTables(1)

但我得到了同样的错误。

所以基本上我需要知道的是如何在 Excel 2010 中执行此类操作。但这里有一个有趣的说明:如果我在 Excel 2003 中创建此报告,请将其保存为 .xls,然后在 2010 中打开它,它会工作。我什至可以将副本另存为 .xlsm,然后打开它,它将使用相同的宏。只有当我在 2010 年创建报告时,我才能让它发挥作用。似乎出于某种原因,它只是找不到查询来更改其命令文本然后刷新。请帮忙,我已经被困了好几天了!

【问题讨论】:

    标签: sql vba excel excel-2003 excel-2010


    【解决方案1】:

    在 XL2007 和 2010 中,查询表包含在工作表中的“ListObject”中,因此您只需将代码调整为:

    Set oQuery = WorkBooks("Book 1").Sheets("Sheet 1").ListObjects(1).QueryTables(1)
    

    http://msdn.microsoft.com/en-us/library/ff841237.aspx

    提姆

    【讨论】:

    • 感谢蒂姆,非常感谢您的帮助。我调整了上面的代码,但随后得到了以下不同的错误,“运行时错误'438'对象不支持此属性或方法”。我正在用谷歌搜索这个错误并在 msdn 网站上进行搜索,但还没有找到修复方法。任何关于为什么会发生这种情况的建议将不胜感激。再次感谢,比尔
    • 好的,蒂姆,这就是答案。感谢上帝,我终于让它工作了。 "设置 oQuery = Workbooks("Book 1").Sheets("Sheet 1").ListObjects(1).QueryTable"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    相关资源
    最近更新 更多