私がやろうとしているのは、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
名前だけを使用できます。
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
LIKE句の使用についてはどうですか?
私が使用しようとしました:
select * from [PES$] where PID_TAG like '*5400001'
成功せず...
これは機能します:
select * from [PES$] where PID_TAG = 'PIT5400001'
しかし、これは私が望むものではありません。
[〜#〜]編集[〜#〜]
うーん....機能するようにワイルドカードを変更する必要があります... *は使用せず、%を使用してください
VBAについては知りませんが、DelphiとC#には、この形式を使用するコードがオンラインにあります
SELECT * FROM [SheetName$A1:B2]
試しましたか?
Powershellを使用している場合、$は内部文字です。 `$を使用
例えば:
"Select * from [VM`$A3:F30]"