質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

8506閲覧

ACCESS 空白日付でのレコード抽出方法

YISS

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/12/09 00:40

前提・実現したいこと

ACCESSにて、下記の様に2つのテキストボックスに日付を入れるとレコードが抽出できるフォームを作成しました。

テキストボックス1(yyyy/mm/dd)
テキストボックス2(yyyy/mm/dd)
[検索ボタン]

日付の始まりと終わりを入れると、レコードは抽出できるのですが、
⇒始まりが空白の場合は、終わりの日付より前の日付を全て抽出
⇒終わりが空白の場合は、始まりの日付より後の日付を全て抽出
最終的に、上記の様したいのですがうまくいきません。

コードが原因かと思うのですが、どのように改善したらよろしいでしょうか?

試したこと

テキストボックスが空白の場合、
テキストボックスの値が、1000/01/01 or 9999/12/31 となるようにしたらよいかなと思い、
下記コードにしたのですが、デバックするとテキストボックスが空白とみなされていないようです。

Nullのところを””にしても同じ結果でした。

該当のソースコード

VBA

1Private Sub btn_3_Click() 2 3 Me.FilterOn = False 4 5 If Me.tx1 = Null Then 6 Me.tx1.Value = "1000/01/01" 7 End If 8 9 If Me.tx2 = Null Then 10 Me.tx2.Value = "9999/12/31" 11 End If 12 13 Me.Filter = "Day Between #" & tx1 & "# And #" & tx2 & " #" 14 Me.FilterOn = True 15 16End Sub

ご教授よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

vba

1 If Me.tx1 = Null Then

Null値は=では判定できません。IsNull関数を使ってください。

vba

1 If IsNull(Me.tx1) Then

あるいは、空白が入力されていたり、""(長さ0の文字列)の場合も考慮するなら、下記の方かいいでしょう。

vba

1 If Trim(Nz(Me.tx1))="" Then

解決済みですか、補足説明。
蛇足かもしれませんが、現状だと日付として正しくないものを入力したときにエラーになります。
例えば、"2020/11/31"とか。IsDate関数で日付として正しいかもチェックした方かいいでしょう。

自分が書くなら下記のような感じになります。

vba

1Private Sub btn_3_Click() 2 Dim strFilter As String 3 4 If Trim(Nz(Me.tx1.Value))="" Then 5 Me.tx1.Value = Null 6 ElseIf IsDate(Me.tx1.Value) Then 7 strFilter =" AND Day >= #" & Me.tx1.Value & "# 8 Else 9 Msgbox "日付として正しい値を入力してください。" 10 Me.tx1.SeFocus 11 Exit Sub 12 End If 13 14 If Trim(Nz(Me.tx2.Value))="" Then 15 Me.tx2.Value = Null 16 ElseIf IsDate(Me.tx2.Value) Then 17 strFilter =" AND Day <= #" & Me.tx2.Value & "# 18 Else 19 Msgbox "日付として正しい値を入力してください。" 20 Me.tx2.SeFocus 21 Exit Sub 22 End If 23 24 strFilter = Mid(strFilter, 6) '先頭の" AND "を削除 25 Me.Filter = strFilter 26 Me.FilterOn = (strFilter <> "") 27 28End Sub

投稿2020/12/09 01:25

編集2020/12/09 01:42
hatena19

総合スコア33782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YISS

2020/12/09 01:37

解決しました。ありがとうございます。
YISS

2020/12/09 02:26

アドバイスありがとうございます。より、よくすることができました。 質問なのですが、 Me.FilterOn = (strFilter <> "" )と、 Me.FilterOn =True では、結果が変わってくるのでしょうか? ちなみに、コードは最終的に下記の様にさせて頂きました Private Sub btn_3_Click() Me.FilterOn = False Dim strFilter As String If Me.tx1 > Me.tx2 Then MsgBox "開始日が、終了日より後の日付です" Exit Sub End If If Trim(Nz(Me.tx1.Value)) = "" Then Me.tx1.Value = Null ElseIf IsDate(Me.tx1.Value) Then strFilter = " AND Day >= #" & Me.tx1.Value & "#" Else MsgBox "日付として正しい値を入力してください。" Me.tx1.SetFocus Exit Sub End If If Trim(Nz(Me.tx2.Value)) = "" Then Me.tx2.Value = Null ElseIf IsDate(Me.tx2.Value) Then strFilter = strFilter & " AND Day <= #" & Me.tx2.Value & "#" Else MsgBox "日付として正しい値を入力してください。" Me.tx2.SetFocus Exit Sub End If strFilter = Mid(strFilter, 6) Me.Filter = strFilter Me.FilterOn = (strFilter <> "") End Sub
hatena19

2020/12/09 02:31

Me.FilterOn = (strFilter <> "" ) の意味ですが、strFilter <> "" は strFilter が空("")のときFalse、文字が格納さていればTrueになります。 日付テキストボックスが両方とも未入力の場合、strFilter が空("")になるのでMe.FilterOn はFalseに、 条件式が格納されていればMe.FilterOn がTrueになるということになります。
YISS

2020/12/09 02:49

理解できました。ご丁寧にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問