VBAプログラムでSQL UPDATEクエリを構成しようとしています。VBA ADOクエリのOPENROWSET
基本的には、現在のブックのテーブルを閉じられたブックのテーブルから更新します。これは、元のブックが.xlsファイルである場合にのみ、以下のクエリを使用して素晴らしい作品:
私は/同じプロバイダを使用してソースに接続するソースファイルとしての.xlsxファイルを使用するようにSub UPDATEQUERY(SourcePath As String, SourceSheet As String, TargetSheet As String, _
Columns As String, Filter As String)
Dim Cn As ADODB.Connection
Dim QUERY_SQL As String
Dim CHAINE_HDR As String
Dim STRCONNECTION As String
CHAINE_HDR = "[Excel 8.0;Provider=Microsoft.ACE.OLEDB.12.0;Mode=1;Extended Properties='HDR=YES;'] "
Set Cn = New ADODB.Connection
QUERY_SQL = _
"UPDATE [" & TargetSheet & "$] INNER JOIN (SELECT * FROM [" & SourceSheet & "$] " & _
"IN '" & SourcePath & "' " & CHAINE_HDR & ") t2 " & _
"ON [" & TargetSheet & "$].id = t2.id " & _
"SET [" & TargetSheet & "$].ColA = t2.ColA "
STRCONNECTION = _
"Driver={Microsoft Excel Driver (*.xls)};" & _
"DriverId=790;" & _
"Dbq=" & ThisWorkbook.FullName & ";" & _
"DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;"
Cn.Open STRCONNECTION
Cn.Execute (QUERY_SQL)
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing
End Sub
現在のwbに接続するために使用するドライバ、つまりMicrosoft.ACE.OLEDB.12.0ではなくMSDASQL.1です。確かに 'CHAINE_HDR'をに設定すると、「ISAMドライバが見つかりません」というメッセージが表示されます。私は "FROM句にSynthaxエラー" を得るしかし
Sub UPDATEQUERY(SourcePath As String, SourceSheet As String, TargetSheet As String, _
Columns As String, Filter As String)
Dim Cn As ADODB.Connection
Dim QUERY_SQL As String
Dim STRCONNECTION As String
Dim STRCONNECTION_SOURCE As String
STRCONNECTION_SOURCE = _
"'MSDASQL.1'," & _
"'Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=" & SourcePath & ";'," & _
"'SELECT * FROM [Data$]'"
Set Cn = New ADODB.Connection
QUERY_SQL = _
"UPDATE [" & TargetSheet & "$] INNER JOIN (SELECT * FROM OPENROWSET(" & STRCONNECTION_SOURCE & ")) t2 " & _
"ON [" & TargetSheet & "$].id = t2.id " & _
"SET [" & TargetSheet & "$].ColA = t2.ColA "
STRCONNECTION = _
"Driver={Microsoft Excel Driver (*.xls)};" & _
"DriverId=790;" & _
"Dbq=" & ThisWorkbook.FullName & ";" & _
"DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;"
Cn.Open STRCONNECTION
Cn.Execute (QUERY_SQL)
'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing
End Sub
:私はこのようなOPENROWSETを使用しようとしているこれを達成するために
。
SQLクエリを正しく設定するにはどうすればよいですか?
おかげ
問題は、内部結合を使用してもMSDQSLとの接続文字列(STRCONNECTION) 'ISAMドライバが見つかりません'が表示されます。私がACEの代わりにこのプロバイダを使用している本当の理由は、ACEが「リンクされたExcelスプレッドシートにあるため、このフィールドを編集できません」というエラーが発生するためです。私が読んだことから、私はACEを古いもの、つまりMSDASQL.1で置き換える必要がありました。私の接続文字列は、ソースファイルの 'Excel 12.0'とは互換性がありません。 {Microsoft Excelドライバ(* .xls、* .xlsx、* .xlsm、* .xlsb)}を使用すると、リンクされたExcelスプレッドシートエラーも発生します。 – Lich4r
それから、そのまま元の構文を維持して、バージョンを変更してください: 'Excel 12.0 Xml;'。申し訳ありませんが、ブックの更新クエリを実行することはありませんし、Excelがデータベースではないため、そのパスを逸脱したくありません。 – Parfait
ちなみに、ACEはここでワークブックに接続するために使用されるエンジンですが、OLEDBプロバイダとODBCドライバは接続するAPIです。彼らは補完的であり、代用ソフトウェアではありません。ACE.12.0は.xlsxファイルに接続する必要があります。古いJet 4.0は.xlsファイルに制限されていました。 – Parfait