2017-05-08 3 views
0

Je tente presque de répliquer la fonctionnalité VLOOKUP avec une fonction personnalisée pour récupérer des données dans une feuille de calcul Excel à partir d'une base de données Access. Jamais fait cela avant, mais je crois comprendre que cela devrait fonctionner:Comment utiliser ADO pour interroger l'accès db dans les fonctions personnalisées d'Excel

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 

Le code est exécuté, mais renvoie l'erreur #VALUE générique. Je peux utiliser la même chaîne de connexion dans un Sub avec Sheet1.Range("A1").CopyFromRecordSet et cela fonctionnera comme prévu, en supprimant la première ligne de la base de données dans ma feuille de calcul. Le problème est donc le query = rs.Fields(0).Value, mais tout ce que je peux trouver en ligne me dit que c'est la bonne façon de le faire, donc je suis à court de ressources.

+0

J'ai du mal à croire que le code fonctionne comme un sous-marin puisqu'il devrait être: 'Set rs = New ADODB.RecordSet' et non' Set rs = New ADODB.Record' – Rory

+0

Typo dans mes tweaks est tout, prendre il est donné que je ne mens pas quand je dis "je l'ai eu comme un sous-marin". –

+0

Eh bien, si vous corrigez cela, cela fonctionne aussi comme une fonction - en supposant que le chemin db est correct et qu'il y a effectivement des enregistrements correspondant aux critères d'entrée. – Rory

Répondre

1

Si vous corrigez ceci:

Set rs = New ADODB.Record 

à ceci:

Set rs = New ADODB.RecordSet 

alors il fonctionnera en fonction, à condition que le chemin db est correct et il y a effectivement des documents correspondant aux critères d'entrée . Vous devriez vraiment ajouter un traitement d'erreur pour cela.