AccessVBAで指定した年月のレコードの存在をチェックする
クロス集計クエリなんかの年月指定をフォームの値を使って可変にしたかったので、エラー処理のためにレコードの存在を調べるメモ。
フォームの値をSQLへ組み込む
年月の条件絞込はSQLの条件で、
Format(フィールド名, 'yyyy/mm') = '2016/08'
のように指定してやればいいのかなと思ったのですが、コメントで指摘していただいて気がついたのですが、フィールドに関数を使ってしまうと、そのフィールドにインデックスが張られていた場合無効になってしまうので、
フィールド名 Between #2016/08/01# And #2016/08/31#
としたほうが良さそうです。
そこへ、こんな感じのフォームのコントロールの値を使って指定します。
Private Sub 処理_Click() Dim Rs As Recordset, strSQL As String, st_d As Date, end_d As Date st_d = Me.年 & "/" & Me.月 & "/1" '月初日を取得 end_d = DateSerial(Me.年, Me.月 + 1, 1) - 1 '月末日を取得 strSQL = "SELECT * FROM テーブル名 WHERE フィールド名 Between #" & st_d & "# And #" & end_d & "#;" 'SQL文作成 Set Rs = CurrentDb.OpenRecordset(strSQL) 'レコード抽出 If Rs.BOF = True And Rs.EOF = True Then 'レコードが存在しなかったら Exit Sub '中止 End If Rs.Close 'レコードセットを閉じる Set Rs = Nothing 'オブジェクトの破棄 'その後の処理 End Sub
シンプルに書くとこんな感じ。
このコードはDAO接続で書いてます。ADOでも書けますので、詳しくはこちらをご参照ください。
実際、年は4桁の西暦であるとか、存在しない月はダメだとか、そもそも指定範囲にレコードが存在しないとかいろいろひっくるめてエラー処理をつけると、こんな感じかなぁ。
Private Sub 処理_Click() Dim Rs As Recordset, strSQL As String, st_d As Date, end_d As Date If IsNull(Me.年) = True Or IsNull(Me.月) = True Then Exit Sub End If If IsNumeric(Me.年) = False Or IsNumeric(Me.月) = False Then MsgBox "数値を入力してください。" Exit Sub End If If Len(Me.年) <> 4 Then MsgBox "年は4桁の西暦で指定してください。" Exit Sub End If If IsDate(Me.年 & "/" & Me.月 & "/1") = False Then MsgBox "存在しない年月です。" Exit Sub End If st_d = Me.年 & "/" & Me.月 & "/1" '月初日を取得 end_d = DateSerial(Me.年, Me.月 + 1, 1) - 1 '月末日を取得 strSQL = "SELECT * FROM テーブル名 WHERE フィールド名 Between #" & st_d & "# And #" & end_d & "#;" 'SQL文作成 Set Rs = CurrentDb.OpenRecordset(strSQL) 'レコード抽出 If Rs.BOF = True And Rs.EOF = True Then'レコードが存在しなかったら MsgBox Me.年 & "年" & Me.月 & "月 のレコードは存在しません。" 'メッセージ Exit Sub '中止 End If Rs.Close 'レコードセットを閉じる Set Rs = Nothing 'オブジェクトの破棄 'その後の処理 End Sub
※コメントでチェック条件の抜けをご指摘いただきまして追加しました!
以上です!
4件のコメント
いつも拝読しています。
「存在しない月はダメだとか」
サンプルコードはチェックしていない気がします…
例:2016年13月
`;:゙`;:゙;`(;゚;ж;゚; )ブフォッ!!!
すみません…! なぜ自分で気づかなかったのか…! ご指摘ありがとうございます、追記いたしました(*`・ω・)ゞ
お久しぶりです。イナカモノです。
SQL文を見て少し気になりましたので…
インデックスが入らないWHERE文になっております。
件数が増えると速度が遅くなるやもしれません。
下記を見て頂ければ分かると思います。
・hatena chips
ttp://hatenachips.blog34.fc2.com/blog-entry-83.html
ちなみにブログ作成はしましたが、私事がもうちょっとで落ち着きそうなので
それからになると思います(;´Д`)
それでは、また。
イナカモノさん、ご指摘ありがとうございます! インデックスのことをすっかり失念しておりました…! 本文修正いたしました。
ブログ開設おめでとうございます! 楽しみにしてますーヽ(*´∀`)ノ
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。