Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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
VBA-从Access生成Excel文件(查询表)_Excel_Ms Access_Vba_Stored Procedures - Fatal编程技术网

VBA-从Access生成Excel文件(查询表)

VBA-从Access生成Excel文件(查询表),excel,ms-access,vba,stored-procedures,Excel,Ms Access,Vba,Stored Procedures,我有一个项目,其基本目标是使用VBA在Access中单击按钮,生成Excel(报表) 此报表的内容是存储过程SQL Server数据库的结果 错误行: With MeuExcel.Worksheets(4) .QueryTables.Add connection:=rs, Destination:=.Range("A2") End With 我得到的是: invalid procedure call or argument (erro '5') 完整代码(使用Remou用户提示编辑)

我有一个项目,其基本目标是使用VBA在Access中单击按钮,生成Excel(报表)

此报表的内容是存储过程SQL Server数据库的结果

错误行:

With MeuExcel.Worksheets(4)
    .QueryTables.Add connection:=rs, Destination:=.Range("A2")
End With
我得到的是:

invalid procedure call or argument (erro '5')
完整代码(使用Remou用户提示编辑):


奇怪的是,代码在Excel中运行时有效,但在Access中不起作用。在Access中,您需要使用Excel应用程序实例作为Excel应用程序对象的前缀,例如:

With MeuExcel.Worksheets(4).QueryTables.Add( _
    connection:=recordset, _
    Destination:=Range("A2"))
End With
Dim rs As recordset
此外,除非您有对Excel库的引用,否则ypu将需要提供内置Excel常量的值

使用对象的名称作为变量是一个非常糟糕的主意。不要说:

Dim recordset As recordset
Set recordset = New recordset
比如说:

With MeuExcel.Worksheets(4).QueryTables.Add( _
    connection:=recordset, _
    Destination:=Range("A2"))
End With
Dim rs As recordset
或者更好:

Dim rs As New ADODB.Recordset
如果你有合适的推荐人。然后可以跳过CreateObject

编辑

提供程序必须是用于绑定记录集的Access OLEDB 10提供程序。我可以使用SQL Server通过Access创建数据表:

strConnect = "Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=True;" _
& "Data Source=XYZ\SQLEXPRESS;Integrated Security=SSPI;" _
& "Initial Catalog=TestDB;Data Provider=SQLOLEDB.1"

FWIW,有两件事很突出:

  • 正如@Remou指出的,Excel引用需要经过限定。目前,
    范围(“A2”)
    不合格。在Excel中运行代码时,假定使用
    ActiveSheet
    。但是,当从另一个应用程序运行时,该应用程序将在其自己的名为
    Range
    的库中查找方法或属性,这将在Microsoft Access中显示该错误

  • With
    块中没有任何代码,因此您可以使用删除
    ,并以
    关键字结束
    ;执行此操作时,还将删除外部(),如下所示:

  • wb.Worksheets(4).QueryTables.Add Connection:=rs,Destination:=wb.Worksheets(4).Range(“A2”)

    或者,将
    With
    块移动到
    工作表
    级别:

    With wb.Worksheets(4)
        .QueryTables.Add Connection:=rs, Destination:=.Range("A2")
    End With
    

    更新对Excel样本的访问权限

    此示例代码自动从Access访问Excel,创建新工作簿并将查询表添加到第一个工作表中。源数据是一个访问表。这在Office2007中运行

    Public Sub ExportToExcel()
      Dim appXL As Excel.Application
      Dim wbk As Excel.Workbook
      Dim wst As Excel.Worksheet
      Dim cn As ADODB.Connection
      Dim rs As ADODB.Recordset
    
      Set appXL = CreateObject("Excel.Application")
      appXL.Visible = True
      Set wbk = appXL.Workbooks.Add
      Set wst = wbk.Worksheets(1)
    
      Set cn = CurrentProject.AccessConnection
      Set rs = New ADODB.Recordset
      With rs
        Set .ActiveConnection = cn
        .Source = "SELECT * FROM tblTemp"
        .Open
      End With
    
      With wst
        .QueryTables.Add Connection:=rs, Destination:=.Range("A1")
        .QueryTables(1).Refresh
      End With
    
    End Sub
    

    您没有说明Office版本,但在Excel 2007/10中,查询表是Listobject的属性,因此您的代码如下:

    With MeuExcel.Worksheets.ListObjects.Add(Connection:=rs, Destination:=Range("A2")).QueryTable
    

    在重读这个问题之后,我意识到这不是问题所在——因为您有一个运行时错误。我认为@RachelHettinger(像往常一样)已经击中了要害。无效的程序调用或argument@Predoff我修改了示例,将
    工作簿
    对象替换为
    Excel应用程序
    对象。不确定这是否能解决您的问题,但它更正确。@Rachel我也尝试过让它工作,我相当肯定在Access中运行时会出现问题。接受数据的工作表仍然不允许使用QueryTables.Add,如Predoff所述,它失败并出现错误5。我使用的例子在Excel中运行得很好,取自MSDN。这在2010中运行得很好,所以@Predoff的解决方案也应该如此。我必须检查区别在哪里!它似乎在连接字符串中,但为什么我还没有看到,因为我使用的连接字符串生成了一个完全有效的记录集。好的,像你一样,我现在有了在Excel中工作但在Access中不工作的代码。添加查询表时似乎出现问题。我还不明白为什么。我想知道是否有另一种解决办法合适?例如,简单地将记录写入工作表是否合适?仅供参考:我多年来一直从Access自动生成Excel查询表,没有任何问题,尽管Access数据是其来源。不过,我还没有在Office 2010中试用过。@Rachel也许你可以发布一些工作访问代码?@Remou我用示例代码更新了我的答案。希望有帮助!