vba公用表expression式cte操作在对象closures时是不允许的

我正在执行从Excel中的工作表连接的sql语句,并将结果返回到另一个工作表。 如果我运行一个嵌套的嵌套查询结果返回没有错误(虽然性能是慢得多3分钟对几秒钟),如果我使用公共表expression式CTE如下所示我得到运行时错误'3704'该对象被closures。 我正在使用Excel 2010并查询Oracle 11g数据库。 查询在蟾蜍工作正常,我似乎记得运行Excel的CTE查询针对甲骨文,所以我不认为这是问题。 我无法控制对数据库进行任何更改或将其设置为存储过程。 预先感谢任何帮助。

完整的密码经过保密处理:

Sub RefreshData() 'Turn off screen updating and alerts Application.ScreenUpdating = False Application.DisplayAlerts = False 'User cell selection when running macro Dim iRowRef As Integer Dim iColRef As Integer SheetRef = ActiveSheet.Name iRowRef = ActiveCell.Row iColRef = ActiveCell.Column Worksheets("Dashboard").Cells(2, 2).Value = "Start time: " & Now() 'Create connection Dim cn As Object Dim rs As Object Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") If strUname = "" Then strUname = InputBox(Prompt:="USERNAME", Title:="Authentication", Default:=(Environ$("Username"))) End If If strPword = "" Then 'strPword = InputBox(Prompt:="PASSWORD", Title:="Authentication", Default:="Password") strPword = modPWMask.InputBoxPW("PASSWORD", "Authentication") End If 

***编辑:问题是连接string中的提供者。 CTE支持依赖于提供者。 谢谢@TimWilliams

 'Connection string cn.ConnectionString = "Provider=MSDAORA.1;User ID=" & strUname & ";Password=" & strPword & ";Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = host.com)(PORT = 100))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = db_prd)))" 'Open connection cn.Open 'Query Data Runoff strQuery = Worksheets("SQL").Cells(2, 2).Value & UCase(Format(Worksheets("Dashboard").Cells(7, 3).Value, "dd-mmm-yyyy")) & Worksheets("SQL").Cells(2, 3).Value 'Send query string to clipboard Dim DataObj3 As New MSForms.DataObject DataObj3.SetText strQuery DataObj3.PutInClipboard 'Clear old data Worksheets("Data").Cells.EntireColumn.Hidden = False Worksheets("Data").Range("C20:E20").ClearContents 'Create recordset from query Set rs = cn.Execute(strQuery) 

这是我得到错误的线:

  'Paste data from record set Worksheets("Data").Range("C20").CopyFromRecordset rs 'Timestamp end time Worksheets("Dashboard").Cells(3, 2).Value = "Last refreshed: " & Now() 'Turn on screen updating and alerts Application.ScreenUpdating = True Application.DisplayAlerts = True 'Return to starting cell Worksheets(SheetRef).Activate Cells(iRowRef, iColRef).Select End Sub 

这又是SQL的机密性再次消毒:

 with cte as ( select ENTITY , ENDPOINT , case when RWS = 1 and ENDPOINT in (13,14) then PCT_B when RWS = 2 and ENDPOINT in (13,14) then PCT_A else PCT_A end as PCT , SUM(case when RWS = 1 and ENDPOINT in (13,14) then cast(BAL_B AS decimal (18,2)) when RWS = 2 and ENDPOINT in (13,14) then cast(BAL_A AS decimal (18,2)) when RWS = 2 then cast(BAL AS decimal (18,2)) else 0 end) as BAL , ROUND(SUM((case when RWS = 1 and ENDPOINT in (13,14) then cast(BAL_B AS decimal (18,2)) when RWS = 2 and ENDPOINT in (13,14) then cast(BAL_A AS decimal (18,2)) when RWS = 2 then cast(BAL AS decimal (18,2)) else 0 end) * (case when RWS = 1 and ENDPOINT in (13,14) then PCT_B when RWS = 2 and ENDPOINT in (13,14) then PCT_A else PCT_A end) /100),2) as ADJ_BAL from SCHEMA.VIEW cross join (select 1 as RWS from dual union select 2 as RWS from dual) where AS_OF_DATE = '01-NOV-2016' group by ENTITY , ENDPOINT , case when RWS = 1 and ENDPOINT in (13,14) then PCT_B when RWS = 2 and ENDPOINT in (13,14) then PCT_A else PCT_A end ) select sum(case when ENTITY = 'ENTITYA' and ENDPOINT <> 33 then ADJ_BAL when ENTITY = 'ENTITYB' then ADJ_BAL when ENTITY = 'ENTITYC' and ENDPOINT <> 33 then ADJ_BAL else 0 end) as BAL_CONSOL , sum(case when ENTITY = 'ENTITYA' then ADJ_BAL else 0 end) as BAL_ENTITYA , sum(case when ENTITY = 'ENTITYB' then ADJ_BAL else 0 end) as BAL_ENTITYB from cte 

为我提供OraOLEDB.Oracle

 cn.CursorLocation = adUseClient 

无法使其与MSDAORA.1提供程序一起使用