web-dev-qa-db-ja.com

Excelシート内の名前付き範囲でSQLステートメントを実行するにはどうすればよいですか?

私がやろうとしているのは、Excelシートの標準の範囲(つまり、名前付き範囲、またはA1:F100)を取り、それにSQLクエリをいくつか実行して、VBAコードでステップスルーできるレコードセットを返すことだけです。または、同じワークブックの別のシートに貼り付けます。

ADODBの使用は1つの考えでしたが、現在のブック内のある範囲を指すように接続文字列を設定するにはどうすればよいですか?

Microsoftクエリウィザードを使用する前に知っていましたが、これは理想的ではありませんでしたが、機能しました。これをシート内の範囲を参照するようにはできません。他のExcelファイルのみです。


これが私が残した機能です。数回実行すると、Excelがクラッシュし、通常のリソース不足エラーメッセージが表示されます。この関数をスプレッドシートから削除しました。すべてがシームレスに複数回実行されるため、これは間違いなくここのコードが原因です。

すべてのオブジェクトをクリーンアップしました(正しく?)。誰かが間違っている可能性のあるアイデアを持っていますか?接続文字列に微調整できるものがあるのでしょうか、それともGetRowsメソッドから返されるバリアントと関係があるのでしょうか。

私はMS ADO 2.8を使用しており、同じ動作で2.5も試しました。

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

名前だけを使用できます。

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

質問パート2への回答

今日のレコードだけが必要なので、SQLを次のように変更できるはずです。

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

接続を閉じていません:

cn.Close

その後

 Set rs=Nothing
 Set cn=Nothing
19
Fionnuala

LIKE句の使用についてはどうですか?

私が使用しようとしました:

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

成功せず...

これは機能します:

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

しかし、これは私が望むものではありません。

[〜#〜]編集[〜#〜]

うーん....機能するようにワイルドカードを変更する必要があります... *は使用せず、%を使用してください

1
Eduardo

VBAについては知りませんが、DelphiとC#には、この形式を使用するコードがオンラインにあります

SELECT * FROM [SheetName$A1:B2]

試しましたか?

0
Eugene Yokota

Powershellを使用している場合、$は内部文字です。 `$を使用

例えば:

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