Windows 8 & Office 2013 Access 2013

フィルターの空白を含む複数選択で抽出数が異なる

投稿日:2017年1月7日 更新日:

Access2007からの新機能だと思うですが、テーブルやデータシートビューでフィルターが使用できます。

Excelのフィルターと同じように操作できて重宝しているのですが、落とし穴があります。

苦々しく思うのですが、まずその現象を説明します。

ここでは、Access2013で解説します。

フィルターボタンでの抽出の件数が異なる?


発端は、分割フォームのデータシートビューで、あるデータを抽出しようとしたのですが、[空白]のみを抽出した時の件数と、[空白]とその他の項目を1つ選択して抽出した時の件数が異なるんですね。

[空白]のみを抽出すると10件なのに、他のデータと組み合わせて抽出すると8件になる。

抽出されない空白があるのです。

これじゃ、データベースとして使えないですよね。

空白が存在する他のフィールドも同じ現象でした。

ただ、この現象を再現しようとテーブルを作成し直してもなかなか同じ現象にならず、四苦八苦してしまいました。

そして、やっと分かったことです。

参考分割フォームの作成と使い方については、以下の記事で解説しています。

分割フォーム(単票フォームとデータシートを同時に表示)の作成と使い方

Accessでは、画面を2つに分け[単票フォーム]と[データシート]を同時に表示できる[分割フォーム]というのがあります。Access200 ...

続きを見る

テーブルの確認

下のようなテーブルがあります。

[備考]フィールドには空白があります。

フィルターは[すべて選択]されています。

テーブル

[備考]フィールドのデータ型は[短いテキスト]です。

フィールドプロパティの[値要求]は[いいえ]、[空文字列の許可]は[はい]です。既定です。

フィールドプロパティ

抽出件数が異なる現象

[空白]のみを抽出するため、[空白]のチェックボックスのみをオンにして[OK]ボタンをクリックします。

空白選択

抽出件数は5個ですね。OKです。

空白抽出

では、ここで、[空白]と[チェック済]のレコードを抽出するため、[空白]と[チェック済]のチェックボックスをオンにして[OK]ボタンをクリックします。

空白と他1つの選択

結果は、下のように3件となります。

おかしいですよね?5件+1件で6件抽出されなければならないのに。

抽出結果

以下は、[空白]、[チェック要]、[チェック済]を抽出した状態です。

[空白]はやはり2個しか抽出されません。

空白と他2つの抽出結果

ですが、たちが悪いことに選択数を[空白]を含めて4個にすると、この現象は出ません。

[空白]、[チェック要]、[チェック済]、[不具合あり]を選択すると、[空白]は5個抽出されます。

空白と他3つの抽出結果

参考フィルターボタンをクリックしても、リストが表示されない場合があります。

フィルターボタンをクリックしてもリストが表示されない

これは、[Accessのオプション]の設定で変更することで解決できます。以下の記事で解説しています。

フィルターボタンをクリックしてもリストが表示されない場合

抽出件数が異なる原因

分かったことです。

空白には[Null値]と[長さ0の文字列]があります。

Microsoftの解説ページをリンクしておきます。

Access の Null 値と、長さ 0 の文字列の違いについて(Microsoft)

上記のテーブルでは№3と№4と№5が[長さ0の文字列]№9と№10が[Null値]なのです。

[空白]のみを抽出する場合は、[Null値]と[長さ0の文字列]が抽出され他の項目と一緒に抽出する場合は、[長さ0の文字列]が抽出されないことがあるのです。

テーブルのフィールドプロパティで[値要求]を[いいえ]、[空文字列の許可]を[はい]としている場合、[Null値]と[長さ0の文字列]の両方が入力されます。

長さ0の文字列を意図的に入力したつもりはないのですが、何かの拍子に[長さ0の文字列]になったのだと思います。

値要求 空文字列の許可 動作
いいえ(既定) いいえ 空白はすべてNull値
いいえ(既定) はい(既定) 空白はNull値と空文字列
はい はい(既定) 空白はすべて空文字列
はい いいえ セルには必ず1文字以上の文字を入力しなければならない

解決策

解決策です。

空白をすべてNull値にすれば、この現象は出ませんので、更新クエリを作成して[長さ0の文字列]を[Null]にします。

更新クエリで空文字列をNullに

テーブル[T_sample]をもとにクエリを作成します。

[備考]フィールドをデザイングリッドに表示して、[抽出条件]に[""]、[レコードの更新]に[Null]と入力して、クエリを実行します。

更新クエリ

更新クエリについては、以下の記事が参考になると思います。

別のテーブルや別フィールドのデータをコピーする(更新クエリ)

Accessで、別のテーブルの値をコピーする方法です。 [商品価格A]と[商品価格B]という2つのテーブルがあります。 参考ここでは[ドキュ ...

続きを見る

[空文字列の許可]を[いいえ]に設定

また、フィールドプロパティで[空文字列の許可]を[いいえ]にしておくと、[長さ0の文字列]は入力されなくなります。

空文字列の許可の変更

Access2003の時の[テキスト型]の既定は、[値要求]-[いいえ]、[空文字列の許可]-[いいえ]だったと思います。

mdbファイルをaccdbファイルに変換するときは、データ型のフィールドプロパティまで、しっかり確認しないといけませんね。

以下の記事でも[値要求]と[空文字列の許可]について記しています。

空白データ(Null値)があっても合計値を求めたい時はNz関数

Accessのクエリで演算フィールドに式を入力しても値を求められないことがあります。 Excelなら空白セルがあっても計算してくれるので、「 ...

続きを見る

追加クエリの実行ができなくて悩んだことがあるのですが、これも原因は[空文字列の許可]の設定の違いでした。

追加クエリの作成方法(追加先テーブルのフィールドへ特定の値を表示)

1つのテーブルに別のテーブルのレコードを追加する方法です。 3個テーブルがあって、各テーブルのフィールド名は同じです。 ここでは例として、テ ...

続きを見る

関連分割フォームのデータシートビューにあるプルダウンで抽出したデータをそのままレポートへ出力することができます。

フォームのフィルター実行後のデータをレポートへ

Accessのフォームでフィルターを実行した後、そのフィルターのデータをそのままレポートへ出力する方法です。 分割フォームの作成 テーブルや ...

続きを見る

バージョンの確認

もっと理解したいあなたへ

おすすめ記事と広告

Profile

執筆者/はま

-Windows 8 & Office 2013 Access 2013

Copyright © 2001-2021 初心者のためのOffice講座 All Rights Reserved.

Copyright© 初心者のためのOffice講座 , 2021 AllRights Reserved Powered by AFFINGER4.