使用Office 365和Excel 2016 .

我正在使用VBA和copyfromrecordset将数据从SQL Server数据库(作为ADO记录集)移动到工作表(假设它被称为“Sheet2”) . 但是,当过程开始时工作簿中的“当前”活动对象是图表工作表(例如,“Cht_Scatter”)时,即使我使用完全限定范围到工作簿中的工作表来调用该过程也会失败copyfromrecordset . 我得到的错误是“自动化错误:调用的对象已与其客户端断开连接” .

如果过程开始时的活动对象是工作表(如“Sheet1”),则copyfromrecordset到“Sheet2”中的范围可正常工作 .

我喜欢copyfromrecordset的速度 . 我也使用过GetRows,但增加的数据转置步骤是速度杀手 .

我使用的一种解决方法是激活作为数据传输目标的工作表,然后重新激活起始活动对象,但这很慢,并且似乎“撤消”我用来提高速度的SCREENUPDATING = FALSE VBA,让事情进一步放缓 .

有没有其他人经历过这种情况,还有什么可以作为替代解决方案?显然,一种方法是将图表工作表转换为工作表,并将图表嵌入新工作表中 . 还有其他想法吗?

这是一个代码示例 . 为了重现问题,您需要做非常具体的事情 . 在新工作簿中,创建两个工作表(Sheet1和Sheet2) . 在Sheet1中,放置一些X-Y配对数据(2个点)并制作一个简单的散点图,将图表放在自己的图表表中 . 如果在激活图表工作表的情况下运行代码模块,则会引发错误 . 如果您运行Sheet1或Sheet2激活的代码,它运行没有问题 .

Option Explicit
Sub GetRecordset()
Dim db As Object
Dim rs As Object
Dim sql As String

Set db = CreateObject("ADODB.Connection")
With db
  .CommandTimeout = 3600
  .Errors.Clear
  .Open "Provider=MSDASQL;Driver={SQL Server};Trusted_Connection=yes;Server=sql_server_name;Database=db_name;"
End With

Set rs = CreateObject("ADODB.Recordset")
sql = "select pdate,gas,water from production where completionid='some text here'"
rs.Open sql, db, 3 ' adOpenStatic

ThisWorkbook.Worksheets("Sheet2").Range("A2").Cells(1, 1).CopyFromRecordset rs

End Sub