Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Excel 2003与Excel 2010(VBA)中的SQL数据库导入数据_Sql_Vba_Excel_Excel 2003_Excel 2010 - Fatal编程技术网

从Excel 2003与Excel 2010(VBA)中的SQL数据库导入数据

从Excel 2003与Excel 2010(VBA)中的SQL数据库导入数据,sql,vba,excel,excel-2003,excel-2010,Sql,Vba,Excel,Excel 2003,Excel 2010,所以,我的公司最终升级到了MS Office 2010。到目前为止,我一直在2003年工作。我是一名SQL程序员,我经常用Excel创建报告,从数据库中提取数据。大多数情况下,我会创建宏,这些宏接受用户将在特定单元格中键入的参数,修改查询,然后根据参数刷新查询 下面是一个非常简单的例子: 在Excel2003中,我将打开一个新工作簿 单击“数据”,然后单击“导入外部数据”,然后单击“新建数据库查询” 然后,它会提示您选择一个数据源,这样我就可以选择要查询的数据库(已经用ODBC连接设置好了) 然

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

下面是一个非常简单的例子:

  • 在Excel2003中,我将打开一个新工作簿
  • 单击“数据”,然后单击“导入外部数据”,然后单击“新建数据库查询”
  • 然后,它会提示您选择一个数据源,这样我就可以选择要查询的数据库(已经用ODBC连接设置好了)
  • 然后我取消查询向导窗口,当我在Microsoft查询编辑器中时,我只需输入我的查询

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

    • 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中实现这一点

    以下是我的步骤和错误:

  • 我打开Excel 2010,进入“数据”选项卡
  • 在“获取外部数据”部分下,我单击“来自其他来源”,并从下拉列表中选择“来自Mircrosoft查询”
  • 然后弹出“选择数据源”框,与上面的步骤3、4、5基本相同
  • 然后我编写相同的宏,创建按钮并将其分配给宏,但当我单击按钮时,我得到以下错误:

    Run-time error '9':
    Subscript out of range
    
    我点击debug,调试器突出显示这一行

    Set oQuery = Sheet1.QueryTables(1)
    
    我试着让这句话更具体一些,比如:

    Set oQuery = WorkBooks("Book 1").Sheets("Sheet 1").QueryTables(1)
    
    但我也犯了同样的错误


    所以基本上我需要知道的是如何在Excel2010中做这类事情。但这里有一个有趣的提示:如果我在Excel2003中创建这个报告,将它保存为.xls,然后在2010年打开它,它就会工作。我甚至可以将一个副本保存为.xlsm,然后打开它,它将使用同一个宏。只有当我在2010年创建报告时,我才能让它工作。出于某种原因,它似乎无法找到修改命令文本然后刷新的查询。请帮帮我,我已经被困在这上面好几天了

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

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


    蒂姆

    谢谢蒂姆,我真的很感谢你的帮助。我调整了上面的代码,但得到了以下不同的错误,“运行时错误'438'对象不支持此属性或方法”。我正在谷歌搜索这个错误,并在msdn网站上搜索,但还没有找到修复方法。任何关于为什么会发生这种情况的建议都将不胜感激。再次感谢你,比洛克·蒂姆,这是答案。谢天谢地,我终于成功了。“Set oQuery=工作簿(“第1册”).Sheets(“第1册”).ListObjects(1).查询表”