在Excel-VBA中访问SQL数据库
我正在从MSDN复制一个VBA代码片段,演示如何从一个SQL查询抓取结果到Excel工作表(Excel 2007)中:
Sub GetDataFromADO() 'Declare variables' Set objMyConn = New ADODB.Connection Set objMyCmd = New ADODB.Command Set objMyRecordset = New ADODB.Recordset 'Open Connection' objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;" objMyConn.Open 'Set and Excecute SQL Command' Set objMyCmd.ActiveConnection = objMyConn objMyCmd.CommandText = "select * from myTable" objMyCmd.CommandType = adCmdText objMyCmd.Execute 'Open Recordset' Set objMyRecordset.ActiveConnection = objMyConn objMyRecordset.Open objMyCmd 'Copy Data to Excel' ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) End Sub
我已经添加了Microsoft ActiveX Data Objects 2.1 Library作为参考。 这个数据库是可以访问的。
现在,当我运行这个子程序时,它有一个错误:
运行时错误3704:closures对象时不允许操作。
在声明中:
ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)
任何想法为什么?
谢谢。
我已将初始目录添加到连接string中。 我也放弃了ADODB.Command语法,只是简单地创build自己的SQL语句,并打开该variables的logging集。
希望这可以帮助。
Sub GetDataFromADO() 'Declare variables' Set objMyConn = New ADODB.Connection Set objMyRecordset = New ADODB.Recordset Dim strSQL As String 'Open Connection' objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDatabase;User ID=abc;Password=abc;" objMyConn.Open 'Set and Excecute SQL Command' strSQL = "select * from myTable" 'Open Recordset' Set objMyRecordset.ActiveConnection = objMyConn objMyRecordset.Open strSQL 'Copy Data to Excel' ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) End Sub
build议的更改:
- 不要调用Command对象的Execute方法;
- 将Recordset对象的Source属性设置为您的Command对象;
- 调用没有参数的Recordset对象的Open方法;
- 从
CopyFromRecordset
调用中的Recordset对象周围删除括号; - 其实声明你的variables:)
修改后的代码:
Sub GetDataFromADO() 'Declare variables' Dim objMyConn As ADODB.Connection Dim objMyCmd As ADODB.Command Dim objMyRecordset As ADODB.Recordset Set objMyConn = New ADODB.Connection Set objMyCmd = New ADODB.Command Set objMyRecordset = New ADODB.Recordset 'Open Connection' objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;" objMyConn.Open 'Set and Excecute SQL Command' Set objMyCmd.ActiveConnection = objMyConn objMyCmd.CommandText = "select * from mytable" objMyCmd.CommandType = adCmdText 'Open Recordset' Set objMyRecordset.Source = objMyCmd objMyRecordset.Open 'Copy Data to Excel' ActiveSheet.Range("A1").CopyFromRecordset objMyRecordset End Sub
我坐在电脑上,没有任何相关的软件,但是从内存来看,代码看起来不对。 您正在执行该命令,但放弃objMyCommand.Execute
返回的RecordSet
。
我会做:
Set objMyRecordset = objMyCommand.Execute
…然后失去“开放logging”部分。
这是一个正确的连接string?
SQL Server实例位于何处?
您将需要validation您是否能够使用上面指定的连接string来与SQL Server连接。
编辑:看看logging集的状态属性,看看是否打开?
另外,在打开logging集之前将CursorLocation属性更改为adUseClient。
将set nocount on
添加到存储过程的开头(如果您在SQL Server上)。 我刚刚在自己的工作中解决了这个问题,它是由中间结果引起的,比如"1203 Rows Affected"
受到"1203 Rows Affected"
,被加载到我试图使用的Recordset
。
@firedrawndagger:列出字段名称/列标题遍历logging集字段集合并插入名称:
Dim myRS as ADODB.Recordset Dim fld as Field Dim strFieldName as String For Each fld in myRS.Fields Activesheet.Selection = fld.Name [Some code that moves to next column] Next