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.
Vous devez vous connecter pour publier un commentaire.
Une chose que vous pouvez être en mesure de faire est d'obtenir l'adresse de la dynamique d'une plage nommée, et de l'utiliser comme entrée dans votre chaîne SQL. Quelque chose comme:
Qui va cracher une chaîne d'adresse, quelque chose comme
$A$1:$A$8
Edit:
Comme je l'ai dit dans mon commentaire ci-dessous, vous pouvez dynamiquement obtenir l'adresse complète (y compris le nom de la feuille) et le choix de l'utiliser directement ou analyser le nom de la feuille pour une utilisation ultérieure:
Qui résulte en une chaîne de caractères comme
=Sheet1!$C$1:$C$4
. Donc, pour votre exemple de code ci-dessus, votre instruction SQL peut êtreActiveWorkbook.Names.Item("namedRangeName").RefersToLocal
qui crache une chaîne comme=Sheet1!$C$1:$C$4
strRangeAddress = Mid(ActiveWorkbook.Names.Item("namedRangeName").RefersToLocal,2)
et exécuter le strSQL je reçois un message d'erreurSheet1!$C$1:$C$4 is not a valid name
. Quelqu'un peut-il m'aider?Dans votre utilisation de SQL comme ceci
"Select * from [Sheet1$A1:A200]"
Bâtiment sur Jeanne-Diego Rodriguez de routine avec Jordi approche et certains de Jacek Kotowski code - Cette fonction permet de convertir les nom de table pour le classeur actif utilisable adresse de requêtes SQL.
Note de MikeL: Ajout de "[#Tout]" comprend les titres d'éviter les problèmes que vous avez signalé.
Je suis un débutant bricoler sur quelqu'un d'autre code, donc merci d'être indulgent et plus de corriger mes erreurs. J'ai essayé votre code et a joué avec l'aide de VBA La suite travaillé avec moi:
Quand j'ai sélectionner la source de données de l'argument de ma fonction, il est tourné dans la feuille Sheet1$A1:G3 format. Si excel changements à Table1[#Tout] la référence dans ma formule, la fonction fonctionne encore correctement
J'ai ensuite utilisé dans votre fonction (essayé de jouer le jeu et ajouter un autre argument à être injecté à l'endroit OÙ...
Espère que votre fonction se développe de plus, je trouve cela très utile. Have a nice day!
Juste de répondre à la deuxième partie de votre question au sujet d'obtenir le nom de la feuille où une table est la suivante:
Edit:
Pour rendre les choses plus claires: quelqu'un a suggéré que l'utilisation de la Gamme sur un objet de Feuille. Dans ce cas, vous n'avez pas besoin; la Plage où la table des vies peuvent être obtenus en utilisant le nom de la table; ce nom est disponible tout au long du livre. Ainsi, l'appel de Plage de fonctionne bien.
Hi récemment examiné cette question et a eu des problèmes de référencement, le nom de la table (liste d'objets) dans excel
si vous placez un suffixe '$' sur le nom de la table tout est bien dans le monde
$
àTableName
...SELECT * FROM [Sheet1$A1:G3]"
. Ce n'est pas le problème ici.trouvé cela et il a travaillé pour moi.
"Où DataTable est la plage Nommée
Comment puis-je exécuter des instructions SQL sur une plage nommée dans une feuille excel?