アプリ版:「スタンプのみでお礼する」機能のリリースについて

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]![フォーム]![備考検索] & "*")

元のテーブルにデータが入力されていないものが抽出で出てきません。
どーしたらよいのでしょうか??教えてください。

A 回答 (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 でつなげていくことをします。
(前述したようにコントロールの参照ではなく、即値を利用した内容で)

(伝わりましたでしょうか)
    • good
    • 0

#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 &・・・
にしているのは、条件判別/記述順番を入れ変えたり、条件を追加したりした際の変更を少なく
程度のものです。


参考になれば、、程度のものです。
    • good
    • 0

No.2です。



> ここで、[備考] Like '*' の条件を記述すると
> rs!備考 = Null 以外のものが抽出対象となります。

失礼しました、確かにその通りです。
(「DCount("*","テーブル")」の第1引数での「*」の場合と
 記憶がごっちゃになってしまっていたようです)

以前の回答では、それも踏まえて回答していたはずだったのですが・・・(汗)
http://oshiete1.goo.ne.jp/qa5108301.html
    • good
    • 0

#1です。



> 消えるデータの備考部分が、NULLなのでしょう。

部分について説明を。


「備考」が、
値要求:いいえ
空文字列の許可:はい

で、作られていた場合、
rs!備考 = Null
rs!備考 = ""
rs!備考 = "ABC"
上記どれでも、データを設定できます。


ここで、[備考] Like '*' の条件を記述すると
rs!備考 = Null 以外のものが抽出対象となります。
(クエリに記述しても Filter に記述しても)

値要求:いいえ の場合は、レコード追加時に、備考に値を設定しないと Null になります。
また、編集操作時に表示されている文字列を選択して、DELキーで削除した時など Null になります。

値が Null のものを含む全てを抽出するためには、条件を記述しないことです。
(#1での書き方になります)

※ #2の方のは、抽出文字列を記述する部分に着目されたものと思います。

※※ 私の環境ではそうです。
    • good
    • 0

> 元のテーブルにデータが入力されていないものが抽出で出てきません。



こちらで作成したサンプルでは、提示された条件式で、『備考』が空白の
ものも抽出されました。
(但し、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かどうか」の判定を省略できる、ということです。
    • good
    • 0

消えるデータの備考部分が、NULLなのでしょう。



書き方を変えます。(未検証)

IIf([Forms]![フォーム]![検索]=Null,True,[テーブル]![備考2] Like "*" & [Forms]![フォーム]![検索] & "*") And IIf([Forms]![フォーム]![備考検索]=Null,True,[テーブル]![備考] Like "*" & [Forms]![フォーム]![備考検索] & "*")

でどうなりますか。


[Forms]![フォーム]![検索]=Null
部分は動いているようですが
IsNull([Forms]![フォーム]![検索])
を私はよく使います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す