- 締切済み
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]![フォーム]![備考検索] & "*") 元のテーブルにデータが入力されていないものが抽出で出てきません。 どーしたらよいのでしょうか??教えてください。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- 30246kiku
- ベストアンサー率73% (370/504)
#5です (なにも反応ありませんが、どうしたのでしょうか) 補足の補足です) > ボタンクリック時、マクロのフィルタの実行で、Where条件式に > [備考] Like "*" & [Forms]![フォーム]![検索] & "*" > を記述すると、VBAで以下の記述と同じことになります。 > Private Sub ボタン_Click() > Me.Filter = "[備考] like '*' & [Forms]![フォーム]![検索] & '*'" > Me.FilterOn = True > End Sub 上記、はしょって記述しました。 マクロのフィルタの実行は、実際には DoCmd 系の ApplyFilter に変換されるようですが、その処理の主は上記だと思っています。 また同様に DoCmd 系に ShowAllRecords があって、フィルタ解除できますが ApplyFilter と同様に Me.Filter / Me.FilterOn を操作するものと、私は解釈しています。 (ここでの DoCmd 系は、一段皮をかぶった関数でしょうか) Me.Filter に直接設定した方が良いのか、 ApplyFilter を使うべきか悩むところです。 あえて、 ApplyFilter を使用する例として、以下が参考になります。 (私は Me.Filter ばかり使ってますが) なお、マクロの条件式に記述できるのは255バイトと2007のヘルプには記述されていました。 255文字なのかもしれませんが、#1での記述は LenB でバイト数を求めると 352 バイトになります。 VBA の記述にトライされてみてはいかがでしょうか。 ※ 私がフィルタに記述する時に注意していること SQL の Where句の記述ができるとヘルプ等に書いてますが、BETWEEN は使わないようにしてます。 単純なものでは動くけど、条件が複数になると動かないなど、いい目見てないので。 その時には、○○ BETWEEN XX AND YY を ○○ >= XX AND ○○ <= YY に変更したり。 単純な比較演算子のものを AND / OR でつなげていくことをします。 (前述したようにコントロールの参照ではなく、即値を利用した内容で) (伝わりましたでしょうか)
- 30246kiku
- ベストアンサー率73% (370/504)
#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 &・・・ にしているのは、条件判別/記述順番を入れ変えたり、条件を追加したりした際の変更を少なく 程度のものです。 参考になれば、、程度のものです。
- DexMachina
- ベストアンサー率73% (1287/1744)
No.2です。 > ここで、[備考] Like '*' の条件を記述すると > rs!備考 = Null 以外のものが抽出対象となります。 失礼しました、確かにその通りです。 (「DCount("*","テーブル")」の第1引数での「*」の場合と 記憶がごっちゃになってしまっていたようです) 以前の回答では、それも踏まえて回答していたはずだったのですが・・・(汗) http://oshiete1.goo.ne.jp/qa5108301.html
- 30246kiku
- ベストアンサー率73% (370/504)
#1です。 > 消えるデータの備考部分が、NULLなのでしょう。 部分について説明を。 「備考」が、 値要求:いいえ 空文字列の許可:はい で、作られていた場合、 rs!備考 = Null rs!備考 = "" rs!備考 = "ABC" 上記どれでも、データを設定できます。 ここで、[備考] Like '*' の条件を記述すると rs!備考 = Null 以外のものが抽出対象となります。 (クエリに記述しても Filter に記述しても) 値要求:いいえ の場合は、レコード追加時に、備考に値を設定しないと Null になります。 また、編集操作時に表示されている文字列を選択して、DELキーで削除した時など Null になります。 値が Null のものを含む全てを抽出するためには、条件を記述しないことです。 (#1での書き方になります) ※ #2の方のは、抽出文字列を記述する部分に着目されたものと思います。 ※※ 私の環境ではそうです。
- DexMachina
- ベストアンサー率73% (1287/1744)
> 元のテーブルにデータが入力されていないものが抽出で出てきません。 こちらで作成したサンプルでは、提示された条件式で、『備考』が空白の ものも抽出されました。 (但し、Nullかどうかの判定には、No.1の方の回答にもある、IsNull関数を 使用する必要があります: http://oshiete1.goo.ne.jp/qa4850675.html ) なので、sachi_1981さんが実際に扱っているAccessファイルでの式と、 サンプルとして提示された式とではどこかが違っている、という可能性が 考えられます。 提示された式は、実は以下のように簡素化できますので、まずは実際の ファイルで使用している式を同様に書き換えて、想定しているものと食い 違いがないか、見直してみられることをお勧めします。 (なお、修正後の式では、「備考」「備考2」の条件の指定順を、提示 テーブルのフィールドと同じにしました) <現在> [テーブル]![備考2] Like IIf([Forms]![フォーム]![検索]=Null,"*","*" & [Forms]![フォーム]![検索] & "*") And [テーブル]![備考] Like IIf([Forms]![フォーム]![備考検索]=Null,"*","*" & [Forms]![フォーム]![備考検索] & "*") <修正後・1(レコードソースで、フィールド名が重複する場合)> [テーブル].[備考] Like "*" & [Forms]![フォーム]![備考検索] & "*" And [テーブル].[備考2] Like "*" & [Forms]![フォーム]![検索] & "*" <修正後・2(レコードソースで、フィールド名が重複しない場合)> [備考] Like "*" & [Forms]![フォーム]![備考検索] & "*" And [備考2] Like "*" & [Forms]![フォーム]![検索] & "*" ※レコードソースにテーブルを直接指定している場合は、こちらでOkです。 【補足説明】 IIF関数で「Nullでなかった場合」に指定している式 "*" & [Forms]![フォーム]![検索] & "*" ですが、これは、『検索』テキストボックスがNullの場合、 ** という結果になります。 これは「Nullだった場合」に指定している「*」と実質的に同じですので、 「Nullかどうか」の判定を省略できる、ということです。
- 30246kiku
- ベストアンサー率73% (370/504)
消えるデータの備考部分が、NULLなのでしょう。 書き方を変えます。(未検証) IIf([Forms]![フォーム]![検索]=Null,True,[テーブル]![備考2] Like "*" & [Forms]![フォーム]![検索] & "*") And IIf([Forms]![フォーム]![備考検索]=Null,True,[テーブル]![備考] Like "*" & [Forms]![フォーム]![備考検索] & "*") でどうなりますか。 ※ [Forms]![フォーム]![検索]=Null 部分は動いているようですが IsNull([Forms]![フォーム]![検索]) を私はよく使います。