D'effectuer des requêtes SQL sur un Tableau Excel dans un Classeur avec des Macro VBA

Je suis en train de faire une macro excel qui va me donner la fonction suivante dans Excel:

=SQL("SELECT heading_1 FROM Table1 WHERE heading_2='foo'")

Me permettant de rechercher (et peut-être même d'insérer) dans mon Classeur de Tables à l'aide de requêtes SQL.

C'est ce que j'ai fait jusqu'à présent:

Sub SQL()

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cn.Open strCon

strSQL = "SELECT * FROM [Sheet1$A1:G3]"

rs.Open strSQL, cn

Debug.Print rs.GetString

End Sub

Mon script fonctionne comme un charme avec codé en dur plages comme dans l'extrait ci-dessus. Il fonctionne aussi très bien avec de la statique des plages nommées.

Cependant, il ne fonctionnera pas avec dynamique des plages nommées ou les NOMS de TABLE qui est le plus important pour moi.

Le plus proche que j'ai trouvé une réponse à la question est ce gars souffrant de la même affliction:
http://www.ozgrid.com/forum/showthread.php?t=72973

Aider quelqu'un?

Modifier

J'ai cuit jusqu'à présent, je peux ensuite utiliser ce nom dans mes requêtes SQL. La limitation est que j'ai besoin de savoir sur quelle feuille, les tableaux sont. Pouvons-nous faire quelque chose à ce sujet?

Function getAddress()

    myAddress = Replace(Sheets("Sheet1").Range("Table1").address, "$", "")
    myAddress = "[Sheet1$" & myAddress & "]"

    getAddress = myAddress

End Function

Merci!

  • Peut-être qu'il ne fera pas beaucoup de différence, mais je pensais que les fonctions personnalisées devait être une Fonction (pas un Sous). Aussi, à la fin de la fonction personnalisée, vous devriez avoir quelque chose comme SQL = theAnswerToDisplayInCell Mais qui pourrait ne pas en rapport avec votre problème.
  • Vous avez tout à fait raison, merci.