2016-04-17 221 views
1

VBA ADOの次のSQLは、「From句に構文エラーがあります。Excel VBA ADO SQL - From句の構文エラー

Sub RunSQL2() 

    Dim cn As ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Dim strFile As String 
    Dim strCon As String 
    Dim strSQL As String 
    Dim ws As Worksheet 
    Dim strRangeAddress As String 
    Dim dataRange As Range 

    strFile = ThisWorkbook.Path & "\" & ThisWorkbook.Name 
    strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _ 
     & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 

    Set cn = CreateObject("ADODB.Connection") 
    Set rs = CreateObject("ADODB.Recordset") 

    cn.Open strCon 

    Set ws = ThisWorkbook.Sheets("mydata") 
    strRangeAddress = ActiveSheet.Name & "$" & ws.Range("A1:C30020").Address(False, False) 

     strSQL = strSQL & " (select s.* from " 
strSQL = strSQL & " (select t.*, row_number() over (partition by child_level order by child_index,child_level) [rownum] from [" & strRangeAddress & "] t) s " 
strSQL = strSQL & " where [rownum] = 1) u " 
strSQL = strSQL & " join (select t2.*, 1 as [rownum] from [" & strRangeAddress & "] t2) v " 
strSQL = strSQL & " on (v.parent_level = u.child_level and v.[rownum] = u.[rownum]) " 
strSQL = strSQL & " union select w.child_index,w.child_level,w.child_level,w.child_index " 
strSQL = strSQL & " from [" & strRangeAddress & "] w " 
strSQL = strSQL & " where w.child_index = 1 " 
strSQL = strSQL & " order by v.child_index;" 


    rs.Open strSQL, cn 

    Debug.Print rs.GetString 

End Sub 

ます。strSQLののDebug.Printは、次のとおりです。

select v.child_index,v.child_level,v.parent_level,u.child_index as parent_index 
from 
    (select s.* 
    from 
    (select t.*, row_number() over (partition by child_level order by child_index,child_level) [rownum] 
     from [mydata$A1:C30020] t 
    ) s 
    where [rownum] = 1 
) u 
join 
    (select t2.*, 1 as [rownum] 
    from [mydata$A1:C30020] t2 
) v on (v.parent_level = u.child_level and v.[rownum] = u.[rownum]) 

union 

select w.child_index,w.child_level,w.child_level,w.child_index 
from [mydata$A1:C30020] w 
where w.child_index = 1 
order by v.child_index; 

私はシンプルます。strSQL列接続工事と戻り結果を使用する場合。これは動作します:

strSQL = "SELECT * FROM [" & strRangeAddress & "]" 

私は正しい構文があると思います。互換性のないSQLからエラーが発生する可能性はありますか?例えば、ADOは 'Partition by'を行うことができますか?

私はExcel 2010 64ビットオフィスを使用しています。

+0

全く理解できない。レビューが承認されたら、クエリが再度正しいかどうか確認してください。後で問題をよく見てください –

+0

** Proのヒント**: 'strSQL = strSQL&'を使用してこのような長くて複雑なクエリを作成する場合、各行の最後に '&vbcrlf'を追加してくださいあなたが 'debug.print strSQL'を実行したときにクエリーが理解できるようになります –

+1

Excelワークブックへの接続に使用するJet/ACE SQLエンジンは、その方言のウィンドウ関数をサポートしていないので、' RowNumber() '、' Over () '、' Partition'などがあります。 – Parfait

答えて

0

ジェット/ ACEのSQLで対応することで、このサブクエリ必要としてウィンドウ関数の代わりに、行番号の相関カウント集計クエリを使用して考えてみましょう:それはありませんでしたので、私はあなたの長いインラインSQLクエリを再フォーマットしている

SELECT v.child_index, v.child_level, v.parent_level, u.child_index, v.parent_index 
FROM 
    (SELECT s.* 
    FROM 
    (SELECT t.*, (SELECT count(*) FROM [mydata$A1:C30020] sub 
        WHERE sub.child_index <= t.child_index 
        AND sub.child_level = t.child_level) as [rownum] 
     FROM [mydata$A1:C30020] t 
    ) s 
    WHERE [rownum] = 1 
) u 
INNER JOIN 
    (SELECT t2.*, 1 as [rownum] 
    FROM [mydata$A1:C30020] t2 
) v 
ON (v.parent_level = u.child_level) AND (v.[rownum] = u.[rownum]) 

UNION 

SELECT w.child_index, w.child_level, w.parent_level, w.child_index, w.parent_index 
FROM [mydata$A1:C30020] w 
WHERE w.child_index = 1 
ORDER BY v.child_index; 
+0

同じことを実現した後に回答した質問を削除しました。 VBAでSQLを試してみましたが、 '1つ以上の必須パラメーターに値が指定されていません'というエラーが表示されます。私はSQL ServerまたはAccessを持つマシン上にないので、VBAの外部でSQLをテストすることはできません。 – curtisp

+0

'[mydata $ A1:C30020]'のトップヘッダーに、指定したとおりのフィールド列、つまりchild_index、child_level、parent_level、child_index、parent_indexがあるかどうかを確認できますか? – Parfait

+0

修正child_index、child_level、parent_level、child_index as parent_index – curtisp