ここから本文です

VBAでFindFirstがエラーになってしまい困っています。 VBAで以下のコードを実行...

アバター

ID非公開さん

2019/5/1001:42:51

VBAでFindFirstがエラーになってしまい困っています。

VBAで以下のコードを実行すると、FindFirstの行で「無効な処理です。」(3219)のようなエラーが出てしまいます。

エラーになる原因や正しいコードをご存知の方がいらっしゃいましたら、ご教示いただきたく存じます。
よろしくお願いいたします。


Sub 価格取得()

Const DB_Connect As String = "●" ←●には実際には接続情報を指定しています。
Dim DB As Database
Dim RS As Recordset
Dim SQL As String
Dim Code As String

Set DB = OpenDatabase("", False, True, DB_Connect)
SQL = "SELECT 商品コード, 価格" _
& " FROM 価格表"
Set RS = DB.OpenRecordset(SQL, dbOpenSnapshot, dbSQLPassThrough)

With ThisWorkbook.Worksheets("商品情報")
For i = 1 To 100 Step 1
Code = .Cells(i, 1)
RS.FindFirst "商品コード='" & Code & "'" ←ここで「無効な処理です。」(3219)のようなエラーが出てしまいます。
If RS.NoMatch Then
.Cells(i, 2) = "-"
Else
.Cells(i, 2) = RS!価格
End If
Next i
End With

End Sub


【備考】
・VBAの参照設定では「Microsoft DAO 3.6 Object Library」を有効にしています。
・FindFirstの条件式については、=の前後に半角スペースを入れたり、Codeの前後に*を入れたり、Codeの前後の'を外したり、何通りか書き方を試してはみたのですが、いずれも同じエラーが出てしまいました。

閲覧数:
54
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

nor********さん

2019/5/1006:53:16

> Set RS = DB.OpenRecordset(SQL, dbOpenSnapshot, dbSQLPassThrough)



Set RS = DB.OpenRecordset(SQL, , dbSQLPassThrough)

にしてみてください。

# 条件指定のないパススルークエリからのrecordsetを
# クライアント側で検索するのはどうかというのも
# ありますが

  • アバター

    質問者

    ID非公開さん

    2019/5/1007:23:15

    ご回答いただき、本当にありがとうございます。
    後程試してみたいと思います。
    ちなみにですが、商品100種類分の価格を取得したい場合、質問文のように一度全商品(100種類分)のレコードセットを取得してからVBA内で検索するのと、SQL文のWHERE句で商品コードを条件に設定し、毎回入れ換えてレコードセットを開き直して一種類ずつ取得するのとでは、どちらの方が速くなりそうでしょうか?
    それから、OpenRecordsetのオプションの「dbOpenSnapshot」を指定しない方が良いのは、どういった理由によるものなのかご教示いただけると幸いです。
    重ねての質問で大変恐縮ではございますが、どうかよろしくお願いいたします。

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる