こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

NULL値を含む場合のフィルタ

アクセスです。
テーブルに
フィールド1 フィールド2
A   
B       B 
C       C
と入ってるとします。

フィールド2についてはNULL値のレコードもあれば、
値が入ってる場合もあります。

このテーブルをフォームにひもづけていて、(帳票フォームにしています)
フォームヘッダーにテキストボックス2つとコマンドボタンがあり

Private Sub コマンド_Click()

Me.Form.Filter = _
"フィールド1 like '*" & Me.テキスト_1.Value & "*'" & " and " _
& "フィールド2 like '*" & Me.テキスト_2.Value & "*'"
Me.Form.FilterOn = True

End Sub

としたときに、レコードのフィールド2に文字が入ってる場合は、抽出できるのですが、
フィールド2がNULLの場合は、1件もヒットしません。

テキスト_1にはAを入れて
テキスト_2には何も入れないで検索してみると、1件もヒットしませんが、
テキスト_1にBを入れて検索すると、Bのレコードが抽出されます。

もちろん
テキスト_1もテキスト_2もBをいれても、Bのレコードが抽出されます。

VBAコードで
& "フィールド2 like '*" & Me.テキスト_2.Value & "*'"
としてるので、NULL値でも抽出されると思ったのですがなぜ何も抽出されないのでしょうか?
ワイルドカードでnull値も検索されないのでしょうか?

テーブルのフィールド2のデータをNull値ではなく、””にしたら、問題なく抽出されましたが
データのNull値はNull値のままにして、空白などの文字には置き換えたくないです。
(というか、すべてのNULL値に空白を入れる作業が大変なのでやりたくないです。
実際のフィールド数は50個くらいあります)

よろしくお願いします。

投稿日時 - 2013-05-22 21:01:53

QNo.8100385

暇なときに回答ください

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

テキスト_2 に入力がなかった場合、

> "フィールド2 like '*" & Me.テキスト_2.Value & "*'"

は、 "フィールド2 like '**'" となり、Null 以外全部・・・という意味になります。
Null のものも対象としたい場合には、条件を記述しない事です。

例えば

 Dim sWhere As String
 Const sAndOr = " AND "

 sWhere = ""
 If (Not IsNull(Me.テキスト_1)) Then
   sWhere = sWhere & sAndOr & "フィールド1 like '*" & Me.テキスト_1 & "*'"
 End If
 If (Not IsNull(Me.テキスト_2)) Then
   sWhere = sWhere & sAndOr & "フィールド2 like '*" & Me.テキスト_2 & "*'"
 End If

 If (Len(sWhere) > 0) Then
   Me.Filter = Mid(sWhere, Len(sAndOr) + 1)
   Me.FilterOn = True
 Else
   Me.FilterOn = False
   Me.Filter = ""
 End If


条件を記述する場合、文字列先頭に必ず sAndOr を付加します。
条件ありの場合は、先頭の sAndOr を除いた分を条件設定します。

投稿日時 - 2013-05-23 04:15:50

お礼

>フィールド2 like '**'" となり、Null 以外全部・・・

ワイルドカードでnull値は抽出されないとのこと、覚えます。

頂いたコードの仕組みがよくわかりませんが、
(特にMe.Filter = Mid(sWhere, Len(sAndOr) + 1)の部分)
使わせていただきます。


ありがとうございました。

投稿日時 - 2013-05-24 21:11:49

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

F1      F2
A   
B       B 
        C

としたら、クリック時イベントに
Me.Form.Filter = _
IIf(IsNull(Me!TX1), "(F1 like '*" & Me!TX1.Value & "*' or F1 is Null)", "(F1 like '*" & Me.TX1.Value & "*')") _
& " and " _
& IIf(IsNull(Me!TX2), "(F2 like '*" & Me!TX2.Value & "*' or F2 is Null)", "(F2 like '*" & Me.TX2.Value & "*')")
Me.Form.FilterOn = True
MsgBox Me.Filter

ということかな?
テキスト_1 → TX1、フィールド1 →F1 のようにしています。

投稿日時 - 2013-05-22 23:11:50

お礼

Filterプロパティの中にIIF関数を入れることもできるのですか。
知りませんでした。

条件として、"*' or F1 is Null
としないと、null値は抽出されないようですね。

投稿日時 - 2013-05-24 21:11:30

あなたにオススメの質問