在Excel-VBA中访问SQL数据库

Sao*_*obi 26 sql excel vba adodb excel-vba

我正在从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
Run Code Online (Sandbox Code Playgroud)

我已经添加了Microsoft ActiveX Data Objects 2.1 Library作为参考.这个数据库是可访问的.

现在,当我运行这个子程序时,它有一个错误:

运行时错误3704:关闭对象时不允许操作.

在声明中:

ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset)
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

谢谢.

Dav*_*ker 25

我已将初始目录添加到您的连接字符串中.我还放弃了ADODB.Command语法,转而只是创建自己的SQL语句并打开该变量的记录集.

希望这可以帮助.

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
Run Code Online (Sandbox Code Playgroud)

  • 它对我有用,谢谢,记得添加对Microsoft ActiveX Data Objects 2.1的引用,但我添加了2.6版本.你也不需要在最后关闭连接?喜欢objMyRecordset.Close? (3认同)

one*_*hen 16

建议的更改:

  • 不要调用Command对象的Execute方法;
  • 将Recordset对象的Source属性设置为Command对象;
  • 调用Recordset对象的Open方法,不带参数;
  • 在调用中删除Recordset对象周围的括号CopyFromRecordset;
  • 实际上声明你的变量:)

修改后的代码:

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
Run Code Online (Sandbox Code Playgroud)