私はこの問題を解決するために本当に一生懸命努力しましたが、私は少し助けが必要になると思います。私はさまざまな言語でプログラムすることができますが、Excel、VBA、またはあなたが行うことができるクエリの経験がないので、私を小さな子供のように扱い、細部にすべて言及してください。
私がやりたいのは、3つの異なるセルの内容を取得し、それらをSQLクエリのパラメーターとして使用することです。
今のところ、ここで説明したようにクエリの作成に問題はありません Excel 2007のパラメータを使用してSQLクエリを実行 そしてセルからパラメータを1回選択できます(文字列を「?」に置き換える)。
しかし、クエリを「= MyQuery($ A $ 1、$ A $ 2、$ A $ 3)」のようなセルに入れるだけで、通常の関数として複数回呼び出したいと思います。
「データベース」は外部ソースから選択された別のExcelファイルであるため、VBAコードで変更があったかどうかはわかりません。
パズルのピースであっても、正しい方向に向けていただければ本当に助かります。クエリにアクセスする方法、クエリを変更する方法、実行する方法が必要です...しかし、いつものように、悪魔は細部にあります。
これは、動的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
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