Access2007からの新機能だと思うですが、テーブルやデータシートビューでフィルターが使用できます。
Excelのフィルターと同じように操作できて重宝しているのですが、落とし穴があります。
苦々しく思うのですが、まずその現象を説明します。
ここでは、Access2013で解説します。
フィルターボタンでの抽出の件数が異なる?
発端は、分割フォームのデータシートビューで、あるデータを抽出しようとしたのですが、[空白]のみを抽出した時の件数と、[空白]とその他の項目を1つ選択して抽出した時の件数が異なるんですね。
[空白]のみを抽出すると10件なのに、他のデータと組み合わせて抽出すると8件になる。
抽出されない空白があるのです。
これじゃ、データベースとして使えないですよね。
空白が存在する他のフィールドも同じ現象でした。
ただ、この現象を再現しようとテーブルを作成し直してもなかなか同じ現象にならず、四苦八苦してしまいました。
そして、やっと分かったことです。
参考分割フォームの作成と使い方については、以下の記事で解説しています。
-
分割フォーム(単票フォームとデータシートを同時に表示)の作成と使い方
Accessでは、画面を2つに分け[単票フォーム]と[データシート]を同時に表示できる[分割フォーム]というのがあります。Access200 ...
テーブルの確認
下のようなテーブルがあります。
[備考]フィールドには空白があります。
以下は、テーブルのデザインビューです。
[備考]フィールドのデータ型は[短いテキスト]です。
フィールドプロパティの[値要求]は[いいえ]、[空文字列の許可]は[はい]です。既定です。
抽出件数が異なる現象
[空白]のみを抽出するため、[空白]のチェックボックスのみをオンにして[OK]ボタンをクリックします。
レコードの抽出件数は5個ですね。すべての空白が抽出されています。OKです。
では、ここで、[空白]と[チェック済]のレコードを抽出するため、[空白]と[チェック済]のチェックボックスをオンにして[OK]ボタンをクリックします。
結果は、下のように3件となります。
おかしいですよね?5件+1件で6件抽出されなければならないのに。
以下は、[空白]、[チェック要]、[チェック済]を抽出した状態です。
[空白]はやはり2個しか抽出されません。
ですが、たちが悪いことに選択数を[空白]を含めて4個にすると、この現象は出ません。
[空白]、[チェック要]、[チェック済]、[不具合あり]を選択すると、[空白]は5個抽出されます。
参考フィルターボタンをクリックしても、リストが表示されない場合があります。
これは、[Accessのオプション]の設定で変更することで解決できます。以下の記事で解説しています。
抽出件数が異なる原因
分かったことです。
空白には[Null値]と[長さ0の文字列]があります。
Microsoftの解説ページをリンクしておきます。
必須プロパティ (Access) | Microsoft Learn(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のフォームでフィルターを実行した後、そのフィルターのデータをそのままレポートへ出力する方法です。 フィルターが実行されていない場 ...