みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ExcelVBAでAccessのデータを検索する

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



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

投稿日時 - 2012-07-12 16:26:31

QNo.7586367

すぐに回答ほしいです

質問者が選んだベストアンサー

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

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** は実際のフィールドネームを使ってください。 

投稿日時 - 2012-07-12 16:47:00

お礼

ありがとうございます。

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

'テーブルを開きます
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:44

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

http://msdn.microsoft.com/ja-jp/library/cc364156.aspx
より引用。
<引用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文を書いたほうがより使いやすいと思いますが。

投稿日時 - 2012-07-12 23:34:51

お礼

ありがとうございます。

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

投稿日時 - 2012-07-13 10:37:38

ANo.3

>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 の中で結果を順に読んでいく様にすべきですね。

投稿日時 - 2012-07-12 17:02:23

お礼

ありがとうございます。

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

知らなかった。

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

投稿日時 - 2012-07-13 10:43:59

ANo.2

ゴメン、
rs.Open strSQL, db, adOpenForwardOnly, adLockReadOnly
だった。

投稿日時 - 2012-07-12 16:48:13

あなたにオススメの質問