• 締切済み

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]![フォーム]![備考検索] & "*") 元のテーブルにデータが入力されていないものが抽出で出てきません。 どーしたらよいのでしょうか??教えてください。

みんなの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.6

#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)
回答No.5

#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.4

No.2です。 > ここで、[備考] Like '*' の条件を記述すると > rs!備考 = Null 以外のものが抽出対象となります。 失礼しました、確かにその通りです。 (「DCount("*","テーブル")」の第1引数での「*」の場合と  記憶がごっちゃになってしまっていたようです) 以前の回答では、それも踏まえて回答していたはずだったのですが・・・(汗) http://oshiete1.goo.ne.jp/qa5108301.html

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#1です。 > 消えるデータの備考部分が、NULLなのでしょう。 部分について説明を。 「備考」が、 値要求:いいえ 空文字列の許可:はい で、作られていた場合、 rs!備考 = Null rs!備考 = "" rs!備考 = "ABC" 上記どれでも、データを設定できます。 ここで、[備考] Like '*' の条件を記述すると rs!備考 = Null 以外のものが抽出対象となります。 (クエリに記述しても Filter に記述しても) 値要求:いいえ の場合は、レコード追加時に、備考に値を設定しないと Null になります。 また、編集操作時に表示されている文字列を選択して、DELキーで削除した時など Null になります。 値が Null のものを含む全てを抽出するためには、条件を記述しないことです。 (#1での書き方になります) ※ #2の方のは、抽出文字列を記述する部分に着目されたものと思います。 ※※ 私の環境ではそうです。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

> 元のテーブルにデータが入力されていないものが抽出で出てきません。 こちらで作成したサンプルでは、提示された条件式で、『備考』が空白の ものも抽出されました。 (但し、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)
回答No.1

消えるデータの備考部分が、NULLなのでしょう。 書き方を変えます。(未検証) IIf([Forms]![フォーム]![検索]=Null,True,[テーブル]![備考2] Like "*" & [Forms]![フォーム]![検索] & "*") And IIf([Forms]![フォーム]![備考検索]=Null,True,[テーブル]![備考] Like "*" & [Forms]![フォーム]![備考検索] & "*") でどうなりますか。 ※ [Forms]![フォーム]![検索]=Null 部分は動いているようですが IsNull([Forms]![フォーム]![検索]) を私はよく使います。

関連するQ&A

  • accessで空白の時の抽出

    access2000を使っています。まだ初心者なので難しい事はできないのですが、クエリを使って絞り込み検索のフォームを作っています。 テーブル内のデータで空白のデータがあります。その際にクエリの抽出条件にlike iif(is null([forms]![formA]![テキスト100]),"*","*"&[forms]![formA]![テキスト100]&"*")としています。フォームのテキストが空白のときは全て抽出するという条件を満たす予定で設定したのですが、テーブル内のデータが空白の物が抽出できません。データが空白がない様にすればいいのでしょうが、クエリの条件で設定できないものでしょうか?データはテキスト型です。

  • IIFのTRUE時に、2つのデータを対象としたい

    アクセスで管理簿を作成しています。 テーブル→クエリ→フォームと作成しています。 テーブル    請求の有無 処理状況 ・・・・・・・ 1  未請求      2  請求中     完了 3            未完了 4   済       完了 抽出フォーム  テキストボックス 請求の有無 [select請求の有無]             処理状況  [select処理状況] このようなテーブル、フォームを作っています。 クエリに、 Like IIf(IsNull([Forms]![F_メニュー]![select請求の有無]),"*",[Forms]![F_メニュー]![select請求の有無]) Like IIf(IsNull([Forms]![F_メニュー]![select請求の有無]),Null,[Forms]![F_メニュー]![select請求の有無]) Like IIf(IsNull([Forms]![F_メニュー]![select処理状況]),"*",[Forms]![F_メニュー]![select処理状況]) Like IIf(IsNull([Forms]![F_メニュー]![select処理状況),Null,[Forms]![F_メニュー]![select処理状況]) と2つのフィールドに抽出条件を2行ずつ記載していますが、SQLをみると、 抽出条件が最終的に、    select請求の有無"*" and select処理状況"*" or  select請求の有無Null and select処理状況Null という条件になっており、1行目や3行目の様に、NULL+データありが抽出できません。 Like IIF(IsNull(フォームA), NULL と"*" ,フォームA)                  ↑↑↑  この部分をNULLと"*"の両方とするような記述方法はありますでしょうか? ご教示の程よろしくお願い致します。

  • Access2000 でのLikeを使用したフィルタ操作

    こんばんは、答えていただけたらありがたいです。。。 今、Access2000で従業員DBを作成しています。 会社の従業員人数が200人ほどいるので、管理できるソフトを作っています。 検索フォームを作成し、姓などをあいまい検索したいと思い、クエリで作ってみましたが、うまくいきません。 姓の抽出条件に Like ("*" & Nz([Forms]![検索君]![TXT3],"*")) と書きましたが、全員出てしまいます。 また、 式1: IIf(IsNull([Forms]![検索君]![TXT3]),True,[Forms]![検索君]![TXT3]) こういう式も書いてみましたが、-1かエラーが出る結果になりました。。。 以上です。よろしくお願いします。

  • アクセスのフィルタについて

    アクセスのフォーム[フォーム1]にフィルタをかける処理についてですが、入力欄の一つ[データ1]に値が入力されていないものだけを抽出する処理をマクロで行いたいと思っておりますが、上手くいきません。(何も抽出されない) フィルタの命令文を下記で書いておりますが、間違っているでしょうか。 Forms![フォーム1]![データ1] = Null

  • VBAによるフィルターでレコードを抽出するには

    レコードの抽出をマクロで行っております。 アクション欄に「フィルターの実行」を設定しWhere条件式に[氏名フリガナ] Like [Forms]![フォーム名]![抽出テキスト名] & "*" Or [氏名] Like [Forms]![フォーム名]![抽出テキスト名] & "*"  と記述して上手くいってます。 これをVBAで行いたいのですが、上記マクロをツールの「マクロをVisual Basic に変換」した式を使用したらエラーになりました。 ちなみにマクロ変換した式は DoCmd.ApplyFilter " ", "[氏名フリガナ] Like [Forms]![フォーム名]![抽出テキスト名] & ""*"" Or [氏名] Like [Forms]![フォーム名]![抽出テキスト名] & ""*""" です。 どこを訂正したら上手くいくのかご指導をお願い致します。

  • アクセスである文字を含む検索2

    先ほど同じタイトルで質問して、お答えいただいて、それで成功したかにみえたのですが、よくみたら、なぜかテーブルよりクエリの方が多い。おかしいなと思い、[顧客名テーブル]を作成し、 お答えいただいた以下の抽出条件に、 Like Iif(IsNull([Forms]![検索フォーム]![検索]),[顧客名テーブル]![顧客名],'*'&[Forms]![検索フォーム]![検索]&'*') としたら、 件数はきちんと表示されました。 しかし、今度は検索ボタンを押すときに「パラメータの入力」ダイアログが表示され、 [Forms]![検索フォーム]![検索]),1,Unknown と表示され、無視すると、きちんと検索できなくなってしまいました。 すみませんがどうしたら解消できるか、教えてください。 よろしくおねがいします。

  • access クエリでIIF文で抽出条件なし

    フォームにコンボボックスを用意し、(コンボボックスは、「両方」、「条件A」、「条件B」の3項目です) クエリで抽出条件にIIF文を使い、 IIf([Forms]![フォーム]![コンボボックス]="両方",'',[Forms]![フォーム]![コンボボックス]) ”両方”を選択した場合は、「抽出条件なし」としたいのですが、できませんでした。 別案として、 IIf([Forms]![フォーム]![コンボボックス]="両方","条件A" or "条件B",[Forms]![フォーム]![コンボボックス]) なども試しましたができませんでした。 どうか解決方法をご教授願います。

  • Access、検索用フォームでのあいまいな検索

    現在、Accessでデータベース作成をしています。 テーブル:  ・テーブルA          ・テーブルB          (A・B間にリレーションシップ設定) クエリ    ・検索クエリ(テーブルA・テーブルBを元に作成) フォーム   ・検索用フォーム(デザインビューでフォーム作成より)          ・検索結果フォーム(検索クエリを元に作成) また、以下のような設定を入力しました。 「検索クエリ」の抽出欄  Like "*" & [Forms]![検索用フォーム]![検索したい名前] & "*"・・(1)  ※検索したい項目、すべての抽出欄に設定済 「検索用フォーム」  検索実行ボタンを作成し、マクロを設定  ・フォームを開く→「検索結果フォーム」  ・フィルタ→「検索クエリ」 上記の設定により、検索用フォームに検索文字を入力することで、その結果を「検索結果フォーム」に反映することができました。 ただ、テーブルAが元になっている項目の抽出欄のみに(1)を入力すると、うまくいくのですが、テーブルBが元になっている項目欄にも (1)を入力しようとすると、検索用フォームからうまく検索することができなくなります。 2つのテーブルを元にしたクエリからは、検索用フォームをつかった複数のOR検索はできないのでしょうか?? ご存知の方、ぜひ教えてください。 よろしくお願いいたします。

  • Access 複数条件のフィルタ

    フォーム[F_MENU]に非連結のテキストボックス検索用A~Cで3つあります。 検索用A 検索用B 検索用C AかつBかつCという全件一致でフィルターをかけてフォーム[詳細]を開きたいのですが DoCmd.OpenForm "F_詳細", , , "A = '" & Forms!F_MENU!検索用A & "'" And "B = '" & Forms!F_MENU!検索用B & "'" And "C = '" & Forms!F_MENU!検索用C & "'" とやると、実行時エラー'13':型が一致しません。 と出てしまいます。 Aだけ、Bだけ、Cだけ、それぞれひとつずつ書けば、エラーなく結果が得られます。 DoCmd.OpenForm "F_詳細", , , "A = '" & Forms!F_MENU!検索用A & "'" DoCmd.OpenForm "F_詳細", , , "B = '" & Forms!F_MENU!検索用B & "'" DoCmd.OpenForm "F_詳細", , , "C = '" & Forms!F_MENU!検索用C & "'" おそらくANDの使い方が誤っていると思うのですが、添削お願いいたします。 全てのテキストボックス及び元テーブルのデータ型はテキスト型です。 条件は3つとも完全一致のみで、検索用ABC、F_詳細のABCそれぞれのカラムにNULL値はありません。 よろしくお願いします。

  • Access2000 null処理

    Accessのデータベースで商品管理のシステムを作っています。 フォーム上で検索条件を入力し、商品管理のテーブルから商品データを検索するというフォーム、クエリを作ります。 商品管理テーブルの中に 「売上日」という項目があります。 検索項目の1つに売上日があるのですが、以下の状況下でレコードを抽出します。 (1)フォーム上には [売上日S]と[売上日F]があり、[売上日S]以上[売上日F]以下でレコードを抽出。 (2)[売上日S]と[売上日F]がともにnullの場合は全件を表示。 (3)テーブルでは、売上日がnullのことがある。nullは最小値とする。 例えば、フォーム上で [売上日S]がnull [売上日F]が07/01/01ならば、 07/01/01、またはそれ以前に売り上げた商品と、売上日がnullのレコードを抽出。(つまり、 <= 07/01/01 or null になる) よく >= iif(IsNull([forms]![form名]![売上日S]),#1950/01/01#,[forms]![form名]![売上日S]) And <= iif(IsNull([forms]![form名]![売上日F]),#2050/12/31#,[forms]![form名]![売上日F]) を抽出条件にしてnull対応するのですが、これでは、売上日Sがnullのときにnullが含まれず、nullが最小値になりません。 なので クエリ上でもう1つ項目を作り iif(IsNull([売上日]),#1950/01/01#,[売上日]) とし、 この項目を上の抽出条件で抽出するようにしました。 これでうまくいくと思ったのですが、だめでした。 [売上日S]と[売上日F]がともにnullのときはすべて項目が表示されます。 しかし、[売上日S]=null,[売上日F]=07/01/01 のような場合、売上日がnullのものが表示されません。 直接、抽出条件に  >= #1950/01/01# And <= #07/01/01# と打てば、ちゃんと動くし、 売上日S = 07/01/01 売上日F = 07/01/10 のようなときは、ちゃんと抽出されます。 売上日S がnull、売上日Fが非ヌルのときにもちゃんと抽出されるようにするにはどうすればよいのでしょうか? ところで、この不具合は私の記述ミスではないと思うのですがコレはAccess2000の不備でしょうか? どなたかアドバイスをお願いします。