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
5 réponses
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
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"
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é?
si vous utilisez powershell, $ est un caractère interne. l'utilisation de " $
par exemple:
"Select * from [VM`$A3:F30]"