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 (i.e. une plage nommée, ou même A1:F100), et d'exécuter quelques requêtes sql sur elle, et de retourner un recordset que je peux soit passer à travers dans le code VBA, ou même simplement coller dans une autre feuille dans le même classeur.

utilisant ADODB était une pensée, mais comment pourrais-je configurer la chaîne de connexion pour pointer vers une certaine portée dans le cahier de travail actuel?

je sais avant que j'ai fait usage de la Assistant requête, ce qui n'était pas idéal, mais cela fonctionne. Je n'arrive pas à me rendre compte que cela se réfère à une plage dans la feuille, seulement d'autres fichiers excel.


Voici la fonction qui me reste. Quand je l'exécute quelques fois mon excel se bloque avec le message d'erreur habituel hors des ressources. J'ai enlevé cette fonction de ma feuille de calcul, et tout fonctionne de façon transparente plusieurs fois, donc il est certainement causé par le code ici.

J'ai nettoyé tous les objets (correctement?). Quelqu'un a une idée de ce qui pourrait mal se passer? Pourrait-il y avoir quelque chose dans la chaîne de connexion qui pourrait être modifié, ou pourrait-il y avoir quelque chose à faire avec la variante qui est retournée à partir de la méthode GetRows?

j'utilise MS ADO 2.8, et j'ai aussi essayé 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
15
demandé sur ashleedawg 2009-05-27 14:17:20
la source

5 ответов

vous pouvez juste 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 partie 2

je remarque que vous voulez seulement les enregistrements d'aujourd'hui, donc vous devriez 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 ensuite

 Set rs=Nothing
 Set cn=Nothing
17
répondu Fionnuala 2009-05-28 18:15:28
la source

Que Diriez-vous d'utiliser une clause similaire?

j'ai essayé d'utiliser:

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

sans succès....

cela fonctionne:

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

mais ce n'est pas ce que je veux.

MODIFIER

hummm.... nous devons changer les caractères génériques pour fonctionner... n'utilisez pas*, utilisez % 151930920"

1
répondu Eduardo 2011-09-25 03:27:22
la source

Je ne sais pas à propos de VBA, mais il y a du code en ligne dans Delphi et C# qui utilise le format

SELECT * FROM [SheetName$A1:B2]

Avez-vous essayé?

0
répondu Eugene Yokota 2009-05-27 14:43:17
la source

si vous utilisez powershell, $ est un caractère interne. l'utilisation de " $

par exemple:

"Select * from [VM`$A3:F30]"
0
répondu tommylux 2017-06-23 16:13:52
la source

vous trouverez ci-dessous tout ce dont vous avez besoin:

chaque lien est pour VBA

Un

deux

trois

-1
répondu praavDa 2018-08-16 10:47:47
la source

Autres questions sur