• ベストアンサー

DAOのrs.Filter =の使い方

Q_CCというクエリーのフィールドにIDがあります。 あるフォームのボタンのイベントプロシージャに Set db = CurrentDb() Set rs = db.OpenRecordset("Q_CC", dbOpenDynaset) rs.Filter = "ID = 'Me.メールID'" としましたけど、フィルターが働いてくれません。 " と ' の使い方がまずいと思います。 私のフォームに「メールID」というものが関連づけられていて、 このメールIDという値はMe.メールIDで求められますが、 このメールIDと同じ値のQ_CCのIDで、Q_CCにフィルタかけたい のです。 rs.Filter = "ID =" + Me.メールID としたらエラーです。 よろしくお願いします。

  • hiroi
  • お礼率89% (223/248)

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

  • ベストアンサー
noname#22222
noname#22222
回答No.1

多分、 ID=" & Nz(Me.ID, 0) としていないことが原因です。 が、素直に、Where節を書いても事足りるのでは・・・。 Private Sub コマンド0_Click()   Dim dbsCurrent As dao.Database   Dim rstTest   As dao.Recordset   Dim strQuerySQL As String          strQuerySQL = "SELECT * FROM A_Query WHERE ID=" & Nz(Me.ID, 0)   Set dbsCurrent = CurrentDb   Set rstTest = dbsCurrent.OpenRecordset(strQuerySQL)   With rstTest     Do Until .EOF       Debug.Print .Fields(0)       .MoveNext     Loop   End With   rstTest.Close   dbsCurrent.Close End Sub

hiroi
質問者

お礼

s_huskyさん 早速の回答ありがとうございます。 Nzでしたか。気づきませんでした。ありがとう。 また、この例文もありがとうございます。 使ってみます。 本日は、この結果を報告できませんが、明日に報告させて頂きます。よろしくお願いします。

hiroi
質問者

補足

遅くなりました。検証してみました。 本当に、わざわざフィルターしなくてもWhere節にしたらいいという意味がよく分かりました。それと、Nz関数で解決出来ました。ありがとうございます。 助かりました。

その他の回答 (1)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

IDフィールドがテキスト型なら rs.Filter = "ID = '" & Me.メールID & "'" 数値型なら rs.Filter = "ID =" & Me.メールID この場合は、Me.メールID のNULL チェックが必要です。 ただし、自分が作る場合は No1さんの方法にします。 Filter にカーソルをあて、F1キーを押して ヘルプを表示すると、その理由が書かれています。

hiroi
質問者

お礼

bonaronさん 早速の回答ありがとうございます。 NULLチェックですね。ヘルプをよく読んでおきます。 すみませんでした。

関連するQ&A

  • ACCESS どこがおかしいのか?

    ACCESSで。クエリからフォームを作成し、検索フォームを作成しようとしています。 AND条件とOR条件を作り検索(抽出)を行いたいのですが、何が間違っているのか、 検索をかけるとすべて「登録がありません」になってしまいます。 どこが間違っているのか、もしくは代替案を教えていただけますでしょうか。 以下は記述した、VBAコードです。 Private Sub 検索ボタン_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Dim stFil As String Set db = CurrentDb() Set rs = db.OpenRecordset("Q_Autoweb", dbOpenDynaset) 'オプションボタンで条件を選択 If 検索条件 = 1 Then rs.Filter = "[タイトル]='" & タイトル検索 & "' and [本文]='" & テキスト15 & "'" Else rs.Filter = "[タイトル]='" & タイトル検索 & "' or [本文]='" & テキスト15 & "'" End If Set rs = rs.OpenRecordset Set Me.Recordset = rs If rs.EOF = True Then MsgBox "登録がありません" Else Me.ID = rs!ID Me.案件名 = rs!案件名 Me.タイトル = rs!タイトル Me.本文 = rs!本文 End If rs.Close Set rs = Nothing db.Close Set db = Nothing End Sub よろしくお願いします。

  • DAOでレコード数を取得したい(ACESSVBA)

    レコードの行数は複数あるのに --------------------------------------------------------- Sub あ() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T_test", dbOpenDynaset) MsgBox rs.RecordCount Set rs = Nothing Set db = Nothing End Sub --------------------------------------------------------- これでレコード数を取得しようとすると1がかえるのですが なぜレコードの行数を取得できないのでしょうか?

  • DAO3.6のFilterプロパティの使用方法

    Windows95,Excel2000でDAO3.6のFilterプロパティを使用しようと 思います。 Filterプロパティの設定方法とOpenrecordsetのパラメータについて 教えて下さい。 RS.Filter = 抽出条件 Set TB8 = RS.OpenRecordSet() でいいのでしょうか? 宜しく御願いします。

  • VBAのコード

    参考書に従って次のようなコードを書きました。 Private Sub previewButton_Click() Dim db as DAO.Database Dim rs as DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("Q_ラベル印刷", dbOpenDynaset)* if me!......................以下略 *印のところで「パラメーターが少なすぎます。1を指定してください。」というメッセージが出ます。 どう直せばいいのでしょうか。 よろしくお願いします。

  • SQLSERVERからデータを取得する方法

    SQLSERVERに商品テーブルを作り ACCESSにローカルテーブル(下記の例では入力テーブル)を 作りました。 ACCESS VBAで ACCESSのローカルテーブルを1件ずつ読み SQLSERVERの商品テーブルを検索したいのですが 下記の例 どちらが処理スピードが速いのですか? なお下記以外にも処理スピードが速い方法が あったら教えてください。 ●例1 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) sql = "SELECT 商品名 FROM 商品テーブル " sql = sql & "where 商品ID = '" & rt![商品ID] & "'" Set rs = db.OpenRecordset(sql) If rs.RecordCount = 0 Then MsgBox "NG" Else MsgBox rs![商品名] End If ●例2 Dim db As DATABASE Dim rs As Recordset   dim rt as Recordset Set db = CurrentDb Set rt = db.OpenRecordset("入力テーブル", dbOpenDynaset) Set rs = db.OpenRecordset("商品テーブル", dbOpenDynaset) rs.FindFirst "商品CD = '" & rt![商品CD] & "'" If rs.NoMatch Then MsgBox "NG" Else MsgBox rs![商品名] End If よろしくお願いします。

  • accessからsqlserverにアップサイジングしましたが,テーブ

    accessからsqlserverにアップサイジングしましたが,テーブルにデータを入力出来なくなってしまいました。 Dim rs As DAO.Recordset Dim db As DAO.Database Set db = CurrentDb() Set rs = db.OpenRecordset("確認用", dbOpenDynaset) rs.AddNew rs!品番 = Me.品番 rs.Update 上記のようにDAOを介してテーブルにデータを入れていました。 アップサイジングする前は、問題なかったのですが、どういったことが原因になりますでしょうか?

  • アクセスVBA 変数での抽出条件の書きかた

    顧客データテーブルからの抽出です。 変数を使った書き方がわかりません。 よろしくお願いします。 テーブルのレコードには [氏名]:鈴木 [telnum]:0123456789 が存在します。 Private Sub テキスト0_BeforeUpdate(Cancel As Integer) Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客マスタ", dbOpenDynaset) Dim str As String str = "0123456789" rs.Filter = "[telnum] = ' " & str & " ' " Set rs = rs.OpenRecordset MsgBox (rs!氏名) ’←エラーメッセージ”カレントレコードがありません。”が出ます End Sub

  • AccessのフォームでAND検索

    Accessで今、土地物件を検索するものを作っています。 物件はテーブルに200件くらいあります。 そのテーブルのフィールドに「土地面積(坪)」と「価格」いう名前のフィールドがあるのですが、この2つは【○○~○○】という具合にフォームでボタンを押せば範囲検索が出来るようになっています。 だけど、OR条件になってしまいます。 出来れば、それをAND条件で検索できる様にしたいのです。 ソースは今このようになっています↓↓ テキスト:「tubo1」「tubo2」「kakaku1」「kakaku2」 Private Sub コマンド55_Click() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("物件情報", dbOpenDynaset) If tubo1 <> "" Then If tubo2 <> "" Then    rs.Filter = "[土地面積(坪)] >=" & tubo1 & " And [土地面積(坪)] <=" & tubo2 Else rs.Filter = "[土地面積(坪)] =" & tubo1 End If If kin1 <> "" Then If kin2 <> "" Then rs.Filter = "[価格] >=" & kakaku1 & " And [価格] <=" & kakaku2 Else rs.Filter = "[価格] =" & kakaku1 End If End If End If Set rs = rs.OpenRecordset Set Me.Recordset = rs Me.Requery Set rs = Nothing Set db = Nothing End Sub です。宜しくお願い致します。 ちなみにAccess2007です。

  • ACCESS2000でテーブルをVBAからテーブルを読み込む方法

    ACCESS2000を使っています。 以下の指定をした場合、「ユーザ定義型は定義されていません」のメッセージが出て、コンパイルが通りません。 なにかインストールや設定が必要なのでしょうか? Dim db As Database Dim rs As Recordset Set db = CurrentDb() Set rs = db.OpenRecordset("テーブル名", dbopendynaset) ヘルプ等を自分なりに参照してみたのですが、わかりません。教えてください。

  • dbOpenTableとdbOpenDynaset

    Access2003 で開発をしています。 サブフォームで選択行のある項目の値を取得したいのですが、 下記ロジック(1)で正しく動作するアプリAと、動作しないアプリBが出てきました。 動作しないアプリは、他の行の値を取ってきてしまいます。 【ロジック(1)】 Set db = CurrentDb Set rs = db.OpenRecordset("サブフォーム用テーブル", dbOpenTable) Cnt = 1 If rs.BOF = True And rs.EOF = True Then Else Do Until Cnt = Forms![メイン]![サブフォーム].Form.CurrentRecord rs.MoveNext Cnt = Cnt + 1 Loop    MsgBox ("項目1の値:" & rs![項目1]) End If 色々調べたところ、正しく動かないアプリでは、ロジックを下記(2)のように変更したら、 正しく動きました。 【ロジック(2)】 Set rs = db.OpenRecordset("サブフォーム用テーブル", dbOpenDynaset)   MsgBox ("項目1の値:" & rs.Fields("項目1").Value) こちらのロジックの方が簡単なのもありますが、 テーブルをopenする際、dbOpenTable と dbOpenDynaset がありますが、 サブフォームのレコードを扱う際には、dbOpenDynaset にするべきなのでしょうか。 ロジック(1)で正しく動作していると思われるアプリAは、現在稼動中のため、 ロジックに間違いがなければそのままにしたいのですが、 ロジック(1)の dbOpenDynaset だと間違いで不具合が起きる可能性があるのでしょうか? ご教授いただければ幸いです。 よろしくお願いいたします。

専門家に質問してみよう