Microsoft Access 掲示板

検索コンボボックスの選択肢追加 / 14

17 コメント
views
4 フォロー
14

サンプルの解説

テーブル T_案件 に 日付/時刻型の「年月日」フィールドがある。
「年月日」は未入力(NUll)のレコードもある。

上記のテーブルから帳票フォームを作成する。
フォームヘッダーにコンボボックスを「cbo年月」を配置する。

値集合ソース

SELECT DISTINCT
 Format(Format([年月日],"yyyy/mm"),"&;""(空欄)""") AS 年月,
 [年月日] Is Null AS N
FROM T_案件
ORDER BY 2, 1 DESC; 

テーブルに未入力のレコードが存在するのでユニオンクエリにする必要はなかったです。
Format([年月日],"yyyy/mm") で年月日を年月に変換、
さらに Format(・・・,"&;""(空欄)""") をかぶせることで、Nullを(空欄)に変換。

(空欄)を先頭に持ってくるようにするために、[年月日] Is Null AS N というフィールドを追加

ORDER BY 2, 1 DESC;
の数字は何列目かを指定しています。下記と同じ意味になります。
ORDER BY [年月日] Is Null, Format(Format([年月日],"yyyy/mm"),"&;""(空欄)""") DESC;
フィールドの式が長いときは簡略化できるので便利です。


cbo年月の更新後処理のイベントプロシージャ

Private Sub cbo年月_AfterUpdate()
    If Nz(Me.cbo年月) = "" Then
        Me.Filter = ""
        Me.FilterOn = False
    ElseIf Me.cbo年月 = "(空欄)" Then
        Me.Filter = "年月日 Is Null"
        Me.FilterOn = True
    Else
        Me.Filter = "年月日>=#" & Me!cbo年月 & "# AND 年月日<#" & _
                     DateAdd("m", 1, Me!cbo年月) & "#"
        Me.FilterOn = True
    End If
End Sub

cbo年月 が未選択の時は全件表示、
"(空欄)"を選択したときは年月日が空欄のレコードを抽出、
年月を選択したときは、その年月のレコードを抽出。

年月でフィルターをかける時、
Me.Filter = "Format([日付],"yyyy/mm")='" & Me!cbo年月 & "'"
とした方がコードは短くなるが、インデックスが無効になるので、処理を軽くしたい場合は上のコードのように年月日フィールドに直接条件を設定するようにしたほうがよい。
詳細は下記参照。

抽出条件でインデックスが無効になる場合 - hatena chips

通報 ...