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

アクセスです。
テーブルに
フィールド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個くらいあります)

よろしくお願いします。

「NULL値を含む場合のフィルタ」の質問画像

A 回答 (2件)

テキスト_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 を除いた分を条件設定します。
    • good
    • 0
この回答へのお礼

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

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

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


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

お礼日時:2013/05/24 21:11

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 のようにしています。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2013/05/24 21:11

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A