VBA-从Access生成Excel文件(查询表)
我有一个项目,其基本目标是使用VBA在Access中单击按钮,生成Excel(报表) 此报表的内容是存储过程SQL Server数据库的结果 错误行: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用户提示编辑)
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,有两件事很突出:
范围(“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我用示例代码更新了我的答案。希望有帮助!