私がしようとしているのは、Excelシート(つまり名前付き範囲、またはA1:F100)上で標準範囲をとり、その上でいくつかのSQLクエリを実行し、VBAでステップバイステップを実行できるレコードセットを返すことですコード、または同じブックの他のシートに貼り付けるだけでも可能です。Excelシート内の名前付き範囲でSQL文を実行するにはどうすればよいですか?
ADODBを使用することも考えましたが、現在のワークブック内のある範囲を指すように接続文字列を設定するにはどうすればよいですか?
私は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
ありがとう、素晴らしい作品。私は別の何かが間違っていたに違いありません(上のコメントを参照)、私はあなたが接続文字列とは何か異なることをしなければならないと思った。 – cOrOllArY
保存していない場合は、ADOに問題が発生する可能性があります。 – Fionnuala
これはすべて正常に動作しますが、何らかの種類のメモリリークが発生しています。 コメントは長すぎますので、以下の関数を投稿します。 – cOrOllArY