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

ADOどころかVBAもよくわかっていない初心者です。


顧客情報DBというアクセスのファイルのテーブル「tb顧客」に
フィルターをかけてフィールド「会社名カナ」に「カブシキ」が入っている
データのみをエクセルに張り付けています。

以下でうまく動くのですが、本当は「*カブシキ*」のところをエクセルで入力した任意の言葉
(Cells(5,3)に入力された文字)をワイルドカードで挟んで実行させたいです。

変数を使ったり、そのままCells(5,3).valueを入れたり、と試してみたのですが
うまくいきません。

正しい書き方がお分かりになる方、よろしくお願いします。


Sub 検索_顧客()

Set myCon = New ADODB.Connection
myCon.Provider = "Microsoft.Ace.OLEDB.12.0"
myCon.Open "C:\Users\Desktop\顧客情報DB.accdb"

Set myRS = New ADODB.Recordset

If Cells(5, 3).Value <> "" Then

With myRS
.Open "tb顧客", myCon, adOpenDynamic, adLockOptimistic
.Filter = "会社名カナ like '*カブシキ*'"
End With
End If

Range("D9").CopyFromRecordset myRS

A 回答 (3件)

単純に下記でできませんか。


.Filter = "会社名カナ like *" & Cell(5,3) & "*"
    • good
    • 0

例えばCells(5,3)に「カブシキ」の文字列が入っているとしたら、


以下の形で求める結果が得られるのではないかと思います。

<現状>
 .Filter = "会社名カナ like '*カブシキ*'"

<修正後>
 .Filter = "会社名カナ like '*" & Cells(5,3) & "*'"


【説明】
「カブシキ」の文字列を置き換える場合、単純にそこを
「Cells(5,3)」にしてしまえばよさそうに思ってしまいがちですが、
実際には「カブシキ」は「"」で括られた中にありますので、
これだと「Cells(5,3)」という文字列そのものがフィルタとして
渡されてしまいます。

そのため、カブシキの部分を一旦「"」の括りの外に外して
考え、

 .Filter = "会社名カナ like '*" & "カブシキ" & "*'"

その上で、「"カブシキ"」の部分を「Cells(5,3)」に変える、
ということになります。
    • good
    • 0

違う観点から



ご提示のVBA記述部分は、この後どうなっていくのでしょうか。
特に myRS は、また何かで使われるのでしょうか。

※ 使われることはない、という前提で。

ADO での曖昧部分は * ではなく % と思ってください。
(Recordset の Filter では * が使えるようですが)

Recordset を Open する時点で、絞り込みします。
また、軽そうなカーソル、読み取りのみとします。
以下、見えている範囲で


If Cells(5, 3).Value <> "" Then
  With myRS
    .Source = "SELECT * FROM tb顧客 WHERE 会社名カナ like '%" & Cells(5,3) & "%';"
    .Open , myCon, adOpenForwardOnly, adLockReadOnly
    Range("D9").CopyFromRecordset myRS
    .Close
  End With
End If


多分、動くと思います。
    • good
    • 0

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