2017-01-04 5 views
0

2つの異なるワークブックから2つのワークシートを結合します。以下は私のコードですが、SQLを実行したときにエラー 'JOIN式がサポートされていません'が発生しました。2つの異なるワークブックから2つのワークシートを結合するときに、結合式がサポートされていません。

Sub RunSELECT() 
Dim cn As Object, rs As Object, output As String, sql As String 
Dim pre_reviewed_file As String, cond As String 

Dim fso As Object, outfile As String, file_obj As Object 

Set fso = CreateObject("Scripting.FileSystemObject") 
outfile = "C:\Users\ZhouK\Desktop\offline comments\offline-comments\result.txt" 
Set file_obj = fso.CreateTextFile(outfile, True) 


pre_reviewed_file = "56022473AML2002 OFFLINE listings 20161010 - reviewed.xls" 


'MsgBox ActiveWorkbook.FullName 
'---Connecting to the Data Source--- 
Set cn = CreateObject("ADODB.Connection") 
With cn 
    .Provider = "Microsoft.ACE.OLEDB.12.0" 
    .ConnectionString = "Data Source=" & ActiveWorkbook.Path & "\" & ActiveWorkbook.Name & ";" & _ 
    "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" 
    .Open 
End With 

cond = "1=1" 

With ActiveWorkbook.Sheets("LIS01").Rows(3) 
    For i = 1 To 24 
     cond = cond & " and a.[" & .Cells(i).Value & "]=b.[" & .Cells(i).Value & "]" 
    Next 
End With 

sheet_name = "LIS01" 

'---Run the SQL SELECT Query--- 
sql = "SELECT b.[COMMENTS] FROM [" & sheet_name & "$A3:AZ3000] a left join [Excel 12.0;HDR=Yes;Database=" & ActiveWorkbook.Path & _ 
     "\" & pre_reviewed_file & ";].[" & sheet_name & "$A3:AZ3000] b on " & cond 

file_obj.Write (sql) 
file_obj.Close 

Set rs = cn.Execute(sql) 
ActiveWorkbook.Sheets("me").Range("A1").CopyFromRecordset rs 

'Do 
    'output = output & rs(0) & ";" & rs(1) & ";" & rs(2) & vbNewLine 
    'Debug.Print rs(0); ";" & rs(1) & ";" & rs(2) 
    'rs.Movenext 
'Loop Until rs.EOF 

'MsgBox output 

'---Clean up--- 
rs.Close 
cn.Close 
Set cn = Nothing 
Set rs = Nothing 
End Sub 

本当のSQLは、私は本当に間違っているどの部分かわからない

select b.[COMMENTS] 
from [LIS01$A3:AZ3000] a 
left join [Excel 12.0;HDR=Yes;Database=C:\Users\ZhouK\Desktop\offline comments\offline-comments\56022473AML2002 OFFLINE listings 20161010 - reviewed.xls;].[LIS01$A3:AZ3000] b 
on 1=1 and a.[Study Site Identifier]=b.[Study Site Identifier] 
and a.[Unique Subject Identifier]=b.[Unique Subject Identifier] 
and a.[CM Record Number]=b.[CM Record Number] 
and a.[Medication]=b.[Medication] 
and a.[Indication]=b.[Indication] 
and a.[AE-Date-Term1]=b.[AE-Date-Term1] and a.[AE-Date-Term2]=b.[AE-Date-Term2] and a.[AE-Date-Term3]=b.[AE-Date-Term3] 
and a.[AE-Date-Term4]=b.[AE-Date-Term4] and a.[AE-Date-Term5]=b.[AE-Date-Term5] 
and a.[MH-Date-Term1]=b.[MH-Date-Term1] and a.[MH-Date-Term2]=b.[MH-Date-Term2] and a.[MH-Date-Term3]=b.[MH-Date-Term3] 
and a.[MH-Date-Term4]=b.[MH-Date-Term4] and a.[MH-Date-Term5]=b.[MH-Date-Term5] 
and a.[Prohylaxis or Other]=b.[Prohylaxis or Other] 
and a.[Dose]=b.[Dose] and a.[Dose Unit]=b.[Dose Unit] 
and a.[Dose Form]=b.[Dose Form] and a.[Frequency]=b.[Frequency] 
and a.[Route]=b.[Route] and a.[Ongoing]=b.[Ongoing] 
and a.[CM Start Date]=b.[CM Start Date] and a.[CM End Date]=b.[CM End Date] 

です。私のコードを見ていただけますか?

+0

ステップ」といったんこの文をヒットすると、直前のウィンドウに "?cond"と照会してreturnキーを押します。そうすれば、実際に構築されたSQL文字列と実際のものとを比較することができます – user3598756

+0

@ user3598756ありがとうございます。私は本当に報道の自由が何を意味するのか分かりません。バックスペースを押しますか?直下のウィンドウで – Kai

+0

と入力すると、 '?cond'と入力して、このクエリの結果をクエリのすぐ下に表示するためにreturnキーを押す必要があります。 – user3598756

答えて

0

問題は、on 1=1という式がJet/ACE SQLダイアレクトのON句に許可されていないため、SQL JOINにあります。あなたは、あなたのループのための文字列を開始するループの後にそれを削除することを検討するために、この項目を必要とするので:

con = Replace(con, "on 1=1 and ", "on ") 

はまた、 WHERE句とカンマで分離 FROMテーブルに ON式を移動することにより、同等のクエリを再作成します。明示的な とは対照的に、暗黙のに参加するとこれが知られている同等の評価とパフォーマンスですどちらもJOINを、使用してに参加:「シート名= 『LIS01』にブレークポイントを置くあなたのコードを

select b.[COMMENTS] 
from [LIS01$A3:AZ3000] a, 
[Excel 12.0;HDR=Yes;Database=C:\Users\ZhouK\Desktop\offline comments\offline-comments\56022473AML2002 OFFLINE listings 20161010 - reviewed.xls;].[LIS01$A3:AZ3000] b 
where 1=1 and a.[Study Site Identifier]=b.[Study Site Identifier] 
and a.[Unique Subject Identifier]=b.[Unique Subject Identifier] 
and a.[CM Record Number]=b.[CM Record Number] 
and a.[Medication]=b.[Medication] 
and a.[Indication]=b.[Indication] 
and a.[AE-Date-Term1]=b.[AE-Date-Term1] and a.[AE-Date-Term2]=b.[AE-Date-Term2] and a.[AE-Date-Term3]=b.[AE-Date-Term3] 
and a.[AE-Date-Term4]=b.[AE-Date-Term4] and a.[AE-Date-Term5]=b.[AE-Date-Term5] 
and a.[MH-Date-Term1]=b.[MH-Date-Term1] and a.[MH-Date-Term2]=b.[MH-Date-Term2] and a.[MH-Date-Term3]=b.[MH-Date-Term3] 
and a.[MH-Date-Term4]=b.[MH-Date-Term4] and a.[MH-Date-Term5]=b.[MH-Date-Term5] 
and a.[Prohylaxis or Other]=b.[Prohylaxis or Other] 
and a.[Dose]=b.[Dose] and a.[Dose Unit]=b.[Dose Unit] 
and a.[Dose Form]=b.[Dose Form] and a.[Frequency]=b.[Frequency] 
and a.[Route]=b.[Route] and a.[Ongoing]=b.[Ongoing] 
and a.[CM Start Date]=b.[CM Start Date] and a.[CM End Date]=b.[CM End Date] 
+0

それは動作します!すばらしいです!ありがとうございました – Kai

関連する問題