2017-05-08 9 views
0

AccessデータベースからExcelスプレッドシートにデータをフェッチするためのカスタム関数をVLOOKUPの機能にほとんど複製しようとしています。しかし、私の理解は、これが動作するはずということである前にこれをやったことがない:Excelのカスタム関数でアクセスデータベースをクエリするためにADOを使用する方法

Function query(lookup_value) 

    Dim cnn As ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Dim sQRY As String 
    Dim strFilePath As String 

    strFilePath = "Z:\filepath\database.accdb" 

    Set cnn = New ADODB.Connection 
    Set rs = New ADODB.Recordset 

    cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = " & strFilePath & ";Jet OLEDB:Database Password=password;" 
    cnn.Open 

    sQRY = "SELECT TOP 1 Ethnic FROM central_reference_table WHERE LearnerCode = '" & lookup_value & "'" 

    rs.Open sQRY, cnn 

    query = rs.Fields(0).Value 

    rs.Close 
    Set rs = Nothing 
    cnn.Close 
    Set cnn = Nothing 


End Function 

コードが実行されますが、一般的な#VALUEエラーを返します。私はSheet1.Range("A1").CopyFromRecordSetでSubで同じ接続文字列を使用することができ、期待どおりに動作し、dbの最初の行をワークシートにドロップします。したがって、それは問題のquery = rs.Fields(0).Valueでなければなりませんが、私がオンラインで見つけることができるのはそれが正しい方法だと言われています。

+0

私はそれがそうでなければならないので、コードがサブとして機能すると信じるのは難しいと思います: 'Set rs = New ADODB.RecordSet'ではなく、Set rs = New ADODB.Record' – Rory

+0

私の調整では、それは私が「サブとして働いている」と言ったときに私が横たわっていないことを考えると、 –

+0

これを訂正すれば、dbパスが正しく、実際に入力条件に一致するレコードがあると仮定して、関数としても機能します。 – Rory

答えて

1

あなたはこの修正した場合:これに

Set rs = New ADODB.Record 

Set rs = New ADODB.RecordSet 

を、それは、DBのパスが正しく、入力条件に一致するレコードが実際にそこにあることは、機能として動作します。実際には、エラー処理を追加する必要があります。

関連する問題