在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