Excelのワークシートから連結されたSQL文を実行して別のワークシートに結果を返します。私がインラインネストされたクエリを実行すると、結果はエラーなしで返されます(性能は3分対数秒よりずっと遅いですが)。以下に示すように共通テーブル式CTEを使用すると、実行時エラー '3704'オブジェクトは閉じられます。私はExcel 2010を使用しており、Oracle 11gデータベースを照会しています。クエリはToadでうまく動作し、Oracleに対してExcelからCTEクエリを実行していることを覚えているようですので、問題ではないと思います。私は、DBに何か変更を加えたり、これをストアドプロシージャとして設定することはできません。どんなass assに対しても事前に感謝します。機密保持のための消毒オブジェクトが閉じているときにvba共通テーブル式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
***編集:問題は、接続文字列で提供していました。 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
「cn.open」という行が失敗していて、実際に接続が正常に開かれたかどうかを確認していません。 – xQbert
私はそのチェックを追加することができますが、上記の前に他の2つのクエリを正常に実行するので、そうは思わないでしょう。 ?cn.State 1 – clarencebuttowski
(1) 'cn.State'ではなく' rs.State'をチェックする(2)Connectionのエラーコレクションをチェックするhttps://support.microsoft.com/en-us/kb/167957 –