web-dev-qa-db-fra.com

Comment puis-je exécuter des instructions SQL sur une plage nommée dans une feuille Excel?

Tout ce que j'essaie de faire est de prendre une plage standard sur une feuille Excel (une plage nommée, ou même A1: F100), d'exécuter des requêtes SQL sur celle-ci et de renvoyer un jeu d'enregistrements que je peux parcourir en code VBA, ou même simplement coller dans une autre feuille du même classeur.

Une idée était d'utiliser ADODB, mais comment puis-je configurer la chaîne de connexion pour qu'elle pointe vers une plage dans le classeur actuel?

Je sais que j’ai déjà utilisé l’assistant de requête Microsoft, qui n’était pas idéal, mais qui fonctionnerait. Je n'arrive pas à faire en sorte que cela fasse référence à une plage de la feuille, mais uniquement à d'autres fichiers Excel.


Voici la fonction qui me reste. Lorsque je l'exécute à quelques reprises, Excel se bloque avec le message d'erreur habituel de ressources insuffisantes. J'ai supprimé cette fonction de ma feuille de calcul et tout se déroule de manière transparente à plusieurs reprises. Elle est donc définitivement causée par le code ici.

J'ai nettoyé tous les objets (correctement?). Quelqu'un a-t-il une idée de ce qui pourrait mal tourner? Peut-il y avoir quelque chose dans la chaîne de connexion qui pourrait être modifié, ou pourrait-il y avoir quelque chose à voir avec la variante renvoyée par la méthode GetRows?

J'utilise MS ADO 2.8 et j'ai également essayé la version 2.5 avec le même comportement.

Function getTimeBuckets() As Collection

Dim strFile As String
Dim strCon As String
Dim strSQL As String
Dim dateRows As Variant
Dim i As Integer
Dim today As Date

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

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

strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
cn.Open strCon

strSQL = "SELECT DISTINCT(Expiration) FROM [PositionSummaryTable] where [Instrument Type] = 'LSTOPT'" 

rs.Open strSQL, cn


dateRows = rs.GetRows
rs.Close

'today = Date
today = "6-may-2009"

For i = 1 To UBound(dateRows, 2)
    If (dateRows(0, i) >= today) Then
        getTimeBuckets.Add (dateRows(0, i))
    End If
Next i

Set dateRows = Nothing
Set cn = Nothing
Set rs = Nothing
End Function
16
cOrOllArY

Vous pouvez simplement utiliser le nom.

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

strFile = Workbooks(1).FullName
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

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

cn.Open strCon

''Pick one:
strSQL = "SELECT * FROM DataTable" ''Named range
strSQL = "SELECT * FROM [Sheet1$A1:E346]" ''Range

rs.Open strSQL, cn

Debug.Print rs.GetString

En réponse à la question 2

Je remarque que vous ne voulez que les disques d'aujourd'hui, vous devriez donc pouvoir modifier le SQL en:

strSQL = "SELECT DISTINCT(Expiration) FROM [PositionSummaryTable] " _
& "where [Instrument Type] = 'LSTOPT' AND [Expiration]=#" _
& Format(Date(),"yyyy/mm/dd") & "#"

Vous n'avez pas fermé la connexion:

cn.Close

Et alors

 Set rs=Nothing
 Set cn=Nothing
18
Fionnuala

Comment utiliser la clause LIKE?

J'ai essayé d'utiliser:

select * from [PES$] where PID_TAG like '*5400001'

sans succès....

cela marche:

select * from [PES$] where PID_TAG = 'PIT5400001'

mais ce n'est pas ce que je veux.

MODIFIER

hummm .... nous devons changer les jokers pour qu'ils fonctionnent ... ne pas utiliser *, utilisez%

1
Eduardo

Je ne connais pas VBA, mais il existe du code en ligne dans Delphi et C # qui utilise le format

SELECT * FROM [SheetName$A1:B2]

L'as tu essayé? 

0
Eugene Yokota

Si vous utilisez powershell, $ est un caractère interne. utiliser `$

par exemple:

"Select * from [VM`$A3:F30]"
0
tommylux