web-dev-qa-db-ja.com

セルの内容をパラメーターとしてExcel2007のExcelクエリに渡す

私はこの問題を解決するために本当に一生懸命努力しましたが、私は少し助けが必要になると思います。私はさまざまな言語でプログラムすることができますが、Excel、VBA、またはあなたが行うことができるクエリの経験がないので、私を小さな子供のように扱い、細部にすべて言及してください。

私がやりたいのは、3つの異なるセルの内容を取得し、それらをSQLクエリのパラメーターとして使用することです。

今のところ、ここで説明したようにクエリの作成に問題はありません Excel 2007のパラメータを使用してSQLクエリを実行 そしてセルからパラメータを1回選択できます(文字列を「?」に置き換える)。

しかし、クエリを「= MyQuery($ A $ 1、$ A $ 2、$ A $ 3)」のようなセルに入れるだけで、通常の関数として複数回呼び出したいと思います。

「データベース」は外部ソースから選択された別のExcelファイルであるため、VBAコードで変更があったかどうかはわかりません。

パズルのピースであっても、正しい方向に向けていただければ本当に助かります。クエリにアクセスする方法、クエリを変更する方法、実行する方法が必要です...しかし、いつものように、悪魔は細部にあります。

2
Terco

これは、動的SQL、ADODBの方法です(必ずADODB参照を追加してください)。これは、セル内の文字列値用に作成されました。また、エラーをキャッチするコードはありません。必要に応じて追加してください。

Public Function Test(p1 As Range, p2 As Range, p3 As Range) As Integer

Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim strSQL As String

cnt.Open "Driver={SQL Server};Server=YY;Database=ZZ;Trusted_Connection=yes"


strSQL = "Select col4 from Table_1 where col1='" & p1.Value & _
          "' and col2='" & p2.Value & _
          "' and col3='" & p3.Value & "'"

rst.Open strSQL, cnt, adOpenStatic, adLockReadOnly, adCmdText

Test = rst("col4")

rst.Close
cnt.Close
Set rst = Nothing
Set cnt = Nothing

End Function

これがADODBのコマンドパラメータの方法ですが、少し注意が必要です。これは、単一文字用に設定されたものです。

Public Function Test(p1 As Range, p2 As Range, p3 As Range) As Integer

Dim cnt As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ccmd As New ADODB.Command
Dim PA1 As New ADODB.Parameter, PA2 As New ADODB.Parameter  
Dim PA3 As New ADODB.Parameter

cnt.Open "Driver={SQL Server};Server=YY;Database=ZZ;Trusted_Connection=yes"
ccmd.ActiveConnection = cnt
ccmd.CommandText = _
    "SELECT col4 FROM Table_1 WHERE col1=? AND col2=? AND col3=?"
ccmd.CommandType = adCmdText

Set PA1 = ccmd.CreateParameter("first", adChar, adParamInput, 1, p1.Value)
Set PA2 = ccmd.CreateParameter("second", adChar, adParamInput, 1, p2.Value)
Set PA3 = ccmd.CreateParameter("third", adChar, adParamInput, 1, p3.Value)

ccmd.Parameters.Append PA1
ccmd.Parameters.Append PA2
ccmd.Parameters.Append PA3

Set rst = ccmd.Execute

Test = rst("col4")

rst.Close
Set rst = Nothing
cnt.Close
Set cnt = Nothing

End Function
3
Lance Roberts

Vbaを使用して、ブック内の接続を操作できます。たとえば、SQLクエリ文字列を作成し、それをCommandTextプロパティに適用してから、Refreshに適用できます。

これがテイスターです

Sub ExamineConnections()
    Dim con As WorkbookConnection

    For Each con In ActiveWorkbook.Connections
        Select Case con.Type
        Case xlConnectionTypeODBC
            Debug.Print con.Name
            Debug.Print "ODBC Connection"
            Debug.Print con.ODBCConnection.Connection
            Debug.Print con.ODBCConnection.CommandText
            Debug.Print
        Case xlConnectionTypeOLEDB
            Debug.Print con.Name
            Debug.Print "OLEDB Connection"
            Debug.Print con.OLEDBConnection.Connection
            Debug.Print con.OLEDBConnection.CommandText
            Debug.Print
        End Select
    Next
End Sub
0
chris neilsen