2009-05-27 8 views
15

私がしようとしているのは、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 

答えて

16

名前を使用できます。パート2

を質問に対して

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 

私はあなたが今日だけの記録をしたいことがわかり、あなたは、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 
+0

ありがとう、素晴らしい作品。私は別の何かが間違っていたに違いありません(上のコメントを参照)、私はあなたが接続文字列とは何か異なることをしなければならないと思った。 – cOrOllArY

+0

保存していない場合は、ADOに問題が発生する可能性があります。 – Fionnuala

+0

これはすべて正常に動作しますが、何らかの種類のメモリリークが発生しています。 コメントは長すぎますので、以下の関数を投稿します。 – cOrOllArY

0

あなたが以下の必要があります。

最初のリンクは、VB.NETのためである2リンク - 6は、VBAのためのものです。

One

Two

Three

Four

Five

Six

Googleで約2〜4分で見つかりました。

+1

こんにちはpraavDa: '$

などを使用しています。私は、私が開いているファイルからそれを行う方法を探しています。それは、別々のExcel文書ではありません。私が必要とするのは、VBAコードを呼び出している現在のドキュメントを参照するように接続文字列を設定する方法、またはこれが可能な場合だけです。 ありがとう、 マイク – cOrOllArY

+0

こんにちはマイク。私が理解するところでは、参照先のドキュメントは、データソースとして参照されているドキュメントです。 Dim stCon As String stCon = "Provider = Microsoft.Jet.OLEDB.4.0;" _ & "データソース= c:\ VBExtreme.xls;" _ & "拡張プロパティ=" "Excel 8.0; HDR = YES" ";" アクティブなブックのパスがでacheivedすることができます行き方:パスのセットで= a.path&「\」&a.Name WB = ActiveWorkbook パスを設定ワークブック として 薄暗いWB、右コン文字列が希望like: Dim stCon As String stCon = "Provider = Microsoft.Jet.OLEDB.4.0;" _ & "データソース="&パス_ & "拡張プロパティ=" "Excel 8.0; HDR =はい" "; – praavDa

+0

そして私が間違っていない場合、文字列の最後の部分はExcelのVBAエディタのツール/リファレンスメニューにあるライブラリのバージョンです(Excel 2003の場合は11、おそらく2007の場合は12)。最後の1つで書式化して申し訳ありませんが、私はコメントに改行を使用できないことを知りませんでした:) – praavDa

0

私はVBAのことは知らないが、コードは

SELECT * FROM [SheetName$A1:B2] 

は、あなたがそれを試してみましたフォーマットを使用するDelphiおよびC#でオンラインがありますか?

+1

VBAでこのようなステートメントをどのように実行しますか? – cOrOllArY

1

LIKE句の使用はどうですか?

私が使用してみました:成功せず

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

....

この作品:

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

をしかし、これは私が望んでいないです。

EDIT

hummm ....我々は$内部の文字がある、あなたはPowerShellを使用している場合%

0

を使用し、 は*を使用しないでください...仕事にワイルドカードを変更する必要があります。私はこれらすべて同じリンクを発見した

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