プロが教えるわが家の防犯対策術!

Excel  VBA で、ADOを用いてAccess のデータを検索するにはどうしたらいいですか。

やりたいこと
検索結果を、Excel のセルにコピーすること。

ソースコード
'MDBファイルに接続します
Set db = New ADODB.Connection
db.Provider = "Microsoft.Jet.OLEDB.4.0"
db.Open "C:\Database\test.mdb"


'レコードセットを開きます
Set rs = New ADODB.Recordset
'テーブルを開きます
rs.Open "PT_MST", db, adOpenForwardOnly, adLockReadOnly



findName = ws.Cells(i, 1) & ws.Cells(i, 2)

Do
' rs.Find "[S_NUM]='" & findName & "'"
rs.Find rs.Fields(1).name & " Like '20k%'"  ← ここで、サポートしていない旨のエラーが出る。
If Not (rs.EOF) Then
Debug.Print rs.Fields(1).Value
Else
Exit Do
End If
rs.MoveNext
Loop Until rs.EOF

'閉じる
rs.Close
db.Close
'終了処理
Set rs = Nothing
Set db = Nothing



どう直したら、検出結果を取得できますか。
ご教示下さい。

A 回答 (4件)

よくわかんないけど、オイラだったら、



findName = ws.Cells(i, 1) & ws.Cells(i, 2)
strSQL = "SELECT * FROM PT_MST WHERE S_NUM ='" & findName & "' and FieldName** like '20k%'"
rs.Open "SELECT * FROM PT_MST WHERE S_NUM ='" ", db, adOpenForwardOnly, adLockReadOnly

do
if rs.eof then exit do
debug.print rs.Fields(1).Value
rst.movenext
Loop

のように、対象レコードでレコードセットを作るかな。
FieldName** は実際のフィールドネームを使ってください。 
    • good
    • 0
この回答へのお礼

ありがとうございます。

結果として次のコードにしました。

'テーブルを開きます
findName = ws.Cells(i, 1) & ws.Cells(i, 3)
strSQL = "SELECT * FROM PT_MST WHERE S_NUM ='" & findName & "'"
rs.Open strSQL, db, adOpenForwardOnly, adLockReadOnly

Do
If rs.EOF Then Exit Do
Debug.Print rs.Fields(1).Value
rs.MoveNext
Loop

お礼日時:2012/07/13 10:34

http://msdn.microsoft.com/ja-jp/library/cc364156 …
より引用。
<引用1>
注意 Find メソッドを呼び出す前にカレント行の位置が設定されていない場合は、エラーが発生します。Find メソッドを呼び出す前に、MoveFirst などの、行の位置を設定するメソッドを呼び出す必要があります。
<引用2>
比較演算子に "like" を使用する場合、文字列値にアスタリスク (*) を含めると、1 つまたは複数の文字または部分文字列を検索することができます。
<引用おわり>

まず、<引用1>に対応できていません。
Do loopの処理をする前に
rs.MoveFirst
するとどうなりますか?

また、<引用2>を参照してほしいのですが、
rs.Find rs.Fields(1).name & " Like '20k%'"
は、%がエラーになっているか、「20k%」という文字列を探すだけになります。
(ADOのFILTERと違って、ADOのFINDでは、%は、部分文字列を検索する意図では使えないはず。)

rs.Open "PT_MST", ・・・
は、JETでaccessのデータベースを参照しているので
select * from PT_MST
と同じ動きをしたと思います。

## なんで、Findを使おうとしているか分りませんので、あえてお薦めはしませんが、
## Find使うよりFilter使ったほうが、それより、
## rs.Open でselect文を書いたほうがより使いやすいと思いますが。
    • good
    • 0
この回答へのお礼

ありがとうございます。

参考にさせて頂きました。

お礼日時:2012/07/13 10:37

>rs.Open "PT_MST", db, adOpenForwardOnly, adLockReadOnly



の"PT_MST"の部分には SQL が入るべきなので、この文がエラーしていそう。
なので、 rs オブジェクトが作成されてないと思われる。
その結果

>rs.Find rs.Fields(1).name & " Like '20k%'" 

の rs.Fields(1).name が無効と言われているのではないかな?

他の回答にもあるように
do_loop の前に select を投げて、
そのあと、do_loop の中で結果を順に読んでいく様にすべきですね。
    • good
    • 0
この回答へのお礼

ありがとうございます。

>do_loop の前に select を投げて、
>そのあと、do_loop の中で結果を順に読んでいく様にすべきですね。

知らなかった。

勉強になりました。 (゜゜)(。。)ペコッ

お礼日時:2012/07/13 10:43

ゴメン、


rs.Open strSQL, db, adOpenForwardOnly, adLockReadOnly
だった。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!