所以,我的公司最终升级到MS Office 2010.到目前为止,我一直在2003年工作。我是一名SQL程序员,我不断在Excel中创建报表,从我们的数据库中提取数据。大多数情况下,我将创建接受用户将键入特定单元格的参数的宏,更改查询,然后根据参数刷新它。
这是一个非常简单的例子:
然后我取消了查询向导窗口,然后当我在Microsoft查询编辑器中时,我只需输入我的查询。
为简单起见,我将从名为*
的表格中选择Agents
,该表格只是为公司及其EmployeeIds
工作的代理商列表。< / p>
select * from Agents
然后我从查询编辑器中弹出“x”,弹出一个名为“导入数据”的框,询问您要将数据放在哪里:在现有工作表中?一个新的工作表?我只是让它返回现有工作表中从单元格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中使用它。
以下是我的步骤和随后的错误:
然后我编写相同的宏,创建按钮并将其分配给marco,但是当我单击按钮时出现以下错误:
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年创建报告时,我无法让它发挥作用。似乎由于某种原因它只是找不到查询来改变它的命令文本然后刷新。请帮忙,我已经坚持了好几天了!
答案 0 :(得分:2)
在XL2007和2010中,查询表包含在工作表中的“ListObject”中,因此您只需将代码调整为:
Set oQuery = WorkBooks("Book 1").Sheets("Sheet 1").ListObjects(1).QueryTables(1)
http://msdn.microsoft.com/en-us/library/ff841237.aspx
添