質問: access2002のフィルタ機能について access2002を使用しています。マクロのフィルタを使って抽出をしたいのですが・・・。 テーブル構造ですが 氏名 備考 備考2 ○○ レ ×× b レ △△ a レ ◆◆ b というものがあります。 今したいのは 備考と備考2に条件をいれ抽出させたいのですが どちらにも条件が入るときは抽出されるのですが どちらか一方にのみ条件を入れた場合うまく抽出できません。 たとえば 備考2 でレを抽出とした場合。 氏名 備考 備考2 ○○ レ ×× b レ △△ a レ 上記結果が必要なのですが 氏名 備考 備考2 ×× b レ △△ a レ 結果はこうなります。 フィルタの条件式は [テーブル]![備考2] like iif([forms]![フォーム]![検索]=null,"*","*" & [forms]![フォーム]![検索] & "*") and [テーブル]![備考] like iif([forms]![フォーム]![備考検索]=null,"*","*" & [forms]![フォーム]![備考検索] & "*") 元のテーブルにデータが入力されていないものが抽出で出てきません。 どーしたらよいのでしょうか??教えてください。
回答: #3です 補足:ちょっと動きを見てみました 2007) [forms]![フォーム]![検索] のようにフォームのコントロールを参照する書き方で、文字列として指定する場合、 私はクエリ以外で成功したことがありません。 (私の書き方の問題でしょうが、初めの1回だけ動いて後は変化なし、などなど) マクロは(ほとんど)使わないので、vbaにて内容を展開して即値で指定するようにしています。 (条件には必要なものだけを指定するようにしながら) ★私ができなかったこと:文字列として指定する記述) ボタンクリック時、マクロのフィルタの実行で、where条件式に [備考] like "*" & [forms]![フォーム]![検索] & "*" を記述すると、vbaで以下の記述と同じことになります。 private sub ボタン_click() me.filter = "[備考] like '*' & [forms]![フォーム]![検索] & '*'" me.filteron = true end sub で、これを実行すると、初めの1回だけ動きます。 (その時の[検索]内容が記憶されるようです) 他のボタンで条件変更し動作した後に、上記ボタンをクリックすると 初めに動作した時の状態に戻ってしまいました。 なので、私は文字列として指定しないようにしています。 (実は今回の検証でも動かせてません) ★必要な分だけを、内容を展開して指定する記述例) private sub ボタン_click() dim swhere as string const orand = " and " swhere = "" if (len(nz(me.検索)) > 0) then swhere = swhere & orand & "[備考] like '*" & trim(me.検索) & "*'" end if if (len(nz(me.備考検索)) > 0) then swhere = swhere & orand & "[備考2] like '*" & trim(me.備考検索) & "*'" end if if (len(swhere) > 0) then me.filter = mid(swhere, len(orand) + 1) me.filteron = true else me.filteron = false me.filter = "" end if end sub 条件を記述する場合、文字列先頭に必ず orand を付加します。 条件がどちらか1つであろうが、複数であろうが、 条件ありの場合は、先頭の orand を除いた分を条件設定します。 初めの記述で swhere = swhere &・・・ にしているのは、条件判別/記述順番を入れ変えたり、条件を追加したりした際の変更を少なく 程度のものです。 参考になれば、、程度のものです。