2016-10-31 14 views
0

私はこのサイトとVBAの両方に新しいので、私に同行してください。ご協力いただきありがとうございます。Excel VBA Oracleにリンクするアクセスクエリを実行中

私はAccessから既存のクエリを実行するVBA関数を持っています。問合せ中の表の中には、ユーザー固有のパスワード・アクセスが必要なOracleデータベースに格納されているものがあります。今、レポートを自動化するために書いたサブはこの関数を7回呼び出し、関数が呼び出されるたびにOracleパスワードを入力する必要があります(サブを停止し、パスワードを間違って入力するとエラーメッセージが表示されます彼らは7回それを行う必要がある場合、私は可能性の高いイベントとして参照してください)。コードは機能しますが、私はコードにパスワードを一度尋ねて、それを使って完了させる方法を見つけたいと思います。私が見つけたすべての解決策には、Oracleに直接接続して問合せを行うことが含まれています。これは、非常に複雑なSQLコーディングを必要とします。

また、いくつかのクエリでAccessとは異なる順序で列がExcelシートに表示されるという問題もあります。これは一貫しているようですので、大きな問題ではありませんが、将来の問題を回避する方法を知りたいと思います。

私が現在使用している機能のコードです。どんな洞察力も大いにありがとう!

Option Explicit 

'Single Argument "qryName" as string. Runs access qry and copys recordset to active sheet. 
Function AccessQueryPull(qryName As String) 

'Declare variables 
Dim rs As ADODB.Recordset 
Dim cn As ADODB.Connection 

'open the connection to the access database 
Set cn = New ADODB.Connection 
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=filePath.accdb;" 

'format the command to run the query 
Dim cmd As New ADODB.Command 
cmd.CommandType = adCmdStoredProc 
cmd.CommandText = qryName 
cmd.ActiveConnection = cn 

'execute the query 
Set rs = New ADODB.Recordset 
Set rs = cmd.Execute() 

'copy data to excel sheet 
ActiveSheet.Cells(2, 1).CopyFromRecordset rs 

'Cleanup 
rs.Close 
Set rs = Nothing 
+0

なぜ機能を7回呼びますか?そして、この関数を呼び出すサブを表示してください。 – Parfait

+0

私はプラントのスケジュールに基づいて将来のクエリのカットオフ日付を決定するのに役立つクエリと同様に、プラントごとのアクセスですでに設定されている履歴と前方参照のクエリが別々に存在するため、サブは単純です。変数を設定するだけで名前を調べたり、既存のデータをクリアしたり、いくつかの計算を実行したり、チャートをフォーマットしたりするなどの変数を設定するだけです。この関数で未定義のクエリを実行して一度呼び出せるようにする方法はありますか? –

答えて

0

Oracle資格情報を入力するたびに、その関数が呼び出されるたびにMS Accessへの新しく新しい接続を作成するという理由があります。

単に関数を呼び出す関数に接続し、接続オブジェクトをパラメータとして渡すだけでMS Access接続を維持します。このようにして、親ルーチンに接続エラーがキャッチされます。列の順序は、SQL文で必要な順序で列を宣言するだけです。

Sub RunQueries() 
    Dim rs As ADODB.Recordset 
    Dim cn As ADODB.Connection 

    'open the connection to the Access database 
    Set cn = New ADODB.Connection 
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=filePath.accdb;" 

    Call AccessQueryPull(cn, "SELECT Col1, Col2, Col3 FROM Qry1") ' AND OTHER 6 CALLS 

    cn.Close 
    Set cn = Nothing  
End Sub 

Function AccessQueryPull(accConn As ADODB.Connection, qryName As String)  
    'format the command to run the query 
    Dim cmd As New ADODB.Command 
    cmd.CommandType = adCmdStoredProc 
    cmd.CommandText = qryName 
    cmd.ActiveConnection = accConn 

    'execute the query 
    Set rs = New ADODB.Recordset 
    Set rs = cmd.Execute() 

    'copy data to excel sheet 
    ActiveSheet.Cells(2, 1).CopyFromRecordset rs 

    'Cleanup 
    rs.Close 
    Set rs = Nothing: Set cmd = Nothing 
End Function 
+0

資格情報問題のために働いていただきありがとうございます。私はSQLが非常に私が実行しているクエリのために複雑なので、私は単にアクセスを処理させているので、列の順序のためのあなたのソリューションを試していない。列ヘッダーとデータを一緒に引っ張って目的を達成する方法を見つけました。助けてくれてありがとう。 –

関連する問題