Microsoft Access 掲示板

フォームのフィルタープロパティ

8 コメント
views
4 フォロー

VBAに記載している下記コードを、そのままフォームのプロパティ「フィルター」に入れましたがうまく絞り込みできません。どこか内容を変更するべきなのでしょうか。

Forms!F鑑賞.Filter = "月>=#" & DateSerial(Year(Date), Month(Date), 1) & "# AND 月<#" & DateSerial(Year(DateAdd("m", 1, Date)), Month(DateAdd("m", 1, Date)), 1) & "#"
Forms!F鑑賞.FilterOn = True

フィルターに入力してみた↓
"月>=#" & DateSerial(Year(Date), Month(Date), 1) & "# AND 月<#" & DateSerial(Year(DateAdd("m", 1, Date)), Month(DateAdd("m", 1, Date)), 1) & "#"
トマト
作成: 2020/11/24 (火) 23:03:07
最終更新: 2020/11/24 (火) 23:03:34
通報 ...
1
hiroton 2020/11/25 (水) 08:20:29 6ffb1@f966d

Forms!F鑑賞.FilterOn = Trueに該当する設定はされていますか?
FilterOn プロパティ
フィルターを適用して、Access データベースのレコードを選択して表示する - フィルターを保存する

何も設定されていなければ(デフォルトの設定だと)
[ホーム]>[並べ替えとフィルター]>[フィルターの実行]
または、
フォームのステータスバー>[フィルター処理なし/フィルター適用]
をクリックして手動でフィルターを適用することになります

フォームを開いたときに自動で適用するなら読み込み時にフィルターを適用プロパティを「はい」にします

2
トマト 2020/11/25 (水) 08:45:48 0029a@1c915

ありがとうございます。
フォームを開いたときに自動で適用したかったのですが、フィルター適用プロパティが「いいえ」になっていたので変更しました。
しかし、新たに問題が起きました。
パラメータの確認ポップアップが出て「Date」と表示されます。

3
hiroton 2020/11/25 (水) 09:48:38 6ffb1@f966d

Date()と記述してください

コードでかっこを使用する

VBAコード上では括弧を省略してもいいし、VBEが自動で省略してくれる(Date()と記述してもDateになる)のですが、クエリやフォーム上ではこのルールが使えないのできちんと括弧付きで記述する必要があります

4
トマト 2020/11/25 (水) 10:01:26 0029a@1c915

ありがとうございます。
Date()も試していたのですが、(記載すればよかったです、2度手間になりスミマセン)
それで行うと、絞り込みが行われませんでした。

"月 Between #" & DateSerial(Year(Date()), Month(Date()), 1) & "# AND #" & DateSerial(Year(Date()), Month(Date()) + 1, -1) & "#"
5
トマト 2020/11/25 (水) 10:02:29 0029a@1c915 >> 4

今コピペして気づいたのですが、式が変わってしまっていますね・・・スミマセン。
最初の式でやり直してみます。

6
トマト 2020/11/25 (水) 10:06:40 0029a@1c915 >> 5

式を修正しました。下記の式なのですが、やはり絞り込みができません。。
※読み込み時にフィルターを適用プロパティを「はい」にしている状態

"月>=#" & DateSerial(Year(Date()), Month(Date()), 1) & "# AND 月<#" & DateSerial(Year(DateAdd("m", 1, Date())), Month(DateAdd("m", 1, Date())), 1) & "#"
7
hiroton 2020/11/25 (水) 11:11:46 6ffb1@f966d

あぁ、すみません。そもそも「コードそのまま」がフィルターとして不適切ですね。フィルターとして設定する文字列はSQL(のWHERE句)に従った記述にしないといけません

日付>=DateSerial(Year(Date()), Month(Date()), 1) AND 日付<DateSerial(Year(DateAdd("m", 1, Date())), Month(DateAdd("m", 1, Date())), 1)

VBAはSQLとして処理できる文字列を発行し、それをデータベースに処理させるという2段階の処理をしています。VBAとして発行したものをそのままフィルターに設置したいとなった場合は、たとえば

MsgBox Forms!F鑑賞.Filter

として表示される文字列を設定することになります。具体例を挙げると

月>=#2020/11/01# AND 月<#2020/12/01#

のようになり、これをそのままフィルターに記述すれば動きます

VBAコード上で文字列を表すための「"」はVBAのための記述なのでフィルター用の文字列に含めてはいけません

この時「#~#」は、「直接記述した文字が日付ですよ」ということを表しています。VBAの出力からは人が見れば日付に見えるだけの文字でしかないので、SQLとして処理するために日付として扱ってほしい部分として「#」で囲っているわけです

これを直接SQLとして関数に置き換える場合「#」まで含めて書き直すこととなります。今回は、DateSerial(Year(Date()), Month(Date()), 1)自身が日付のデータとなるので、単純に「#」が不要になります

8
トマト 2020/11/25 (水) 11:37:04 0029a@1c915

ありがとうございます。
やっと理解できてきた気がします。
詳しく教えてくださり、本当に感謝の気持ちでいっぱいです。