2017-10-28 47 views
0

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クエリを正しく設定するにはどうすればよいですか?

おかげ

答えて

1

まず、OPENROWSETには、Microsoft SQL Serverの方法(すなわち、TSQL)あなたのリンクを参照しています。このようなクエリは、SQL Serverクエリ内でのみ実行されます。 Jet/ACE SQL Engine(現在使用している)メソッドではありません。つまり、データベースを混在させることになります。同様に、Oracleの方法はPostgresデータベースでは機能しません。

そして、はい、ACE 12.0プロバイダは、単に古いMSアクセス(MS ExcelにOfficeの兄弟).MDBと現在のを持つことができるよう、古い.XLSと現在のの.xlsxファイルの両方に接続することができます.accdbファイル。単純にバージョンをExcel 8.0;からExcel 12.0 Xml;に変更してください。実際に

、あなたも次の形式を使用して、インラインSQLコマンドでプロバイダを指定する必要はありません:MS Accessの(高度データベースのニーズに助言、および使用可能で

...INNER JOIN [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Excel\File.xlsx].[SHEETNAME$] 

すべてのWindowsマシンで、MSAccess.exeのインストールに関係なく)、Excelパラメータを指定する必要はありません。

...INNER JOIN [C:\Path\To\Access\File.mdb].[TABLENAME] 

...INNER JOIN [C:\Path\To\Access\File.accdb].[TABLENAME] 
+0

問題は、内部結合を使用してもMSDQSLとの接続文字列(STRCONNECTION) 'ISAMドライバが見つかりません'が表示されます。私がACEの代わりにこのプロバイダを使用している本当の理由は、ACEが「リンクされたExcelスプレッドシートにあるため、このフィールドを編集できません」というエラーが発生するためです。私が読んだことから、私はACEを古いもの、つまりMSDASQL.1で置き換える必要がありました。私の接続文字列は、ソースファイルの 'Excel 12.0'とは互換性がありません。 {Microsoft Excelドライバ(* .xls、* .xlsx、* .xlsm、* .xlsb)}を使用すると、リンクされたExcelスプレッドシートエラーも発生します。 – Lich4r

+0

それから、そのまま元の構文を維持して、バージョンを変更してください: 'Excel 12.0 Xml;'。申し訳ありませんが、ブックの更新クエリを実行することはありませんし、Excelがデータベースではないため、そのパスを逸脱したくありません。 – Parfait

+0

ちなみに、ACEはここでワークブックに接続するために使用されるエンジンですが、OLEDBプロバイダとODBCドライバは接続するAPIです。彼らは補完的であり、代用ソフトウェアではありません。ACE.12.0は.xlsxファイルに接続する必要があります。古いJet 4.0は.xlsファイルに制限されていました。 – Parfait

関連する問題