AccessVBAで指定した年月のレコードの存在をチェックする

AccessVBAで指定した年月のレコードの存在をチェックする

クロス集計クエリなんかの年月指定をフォームの値を使って可変にしたかったので、エラー処理のためにレコードの存在を調べるメモ。


フォームの値をSQLへ組み込む

年月の条件絞込はSQLの条件で、

Format(フィールド名, 'yyyy/mm') = '2016/08'

のように指定してやればいいのかなと思ったのですが、コメントで指摘していただいて気がついたのですが、フィールドに関数を使ってしまうと、そのフィールドにインデックスが張られていた場合無効になってしまうので、

フィールド名 Between #2016/08/01# And #2016/08/31#

としたほうが良さそうです。

161102-1

そこへ、こんな感じのフォームのコントロールの値を使って指定します。

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

※コメントでチェック条件の抜けをご指摘いただきまして追加しました!

以上です!

公開日:2016/11/02
更新日:2016/11/22

書籍を執筆しています。

4件のコメント

  1. x より:

    いつも拝読しています。

    「存在しない月はダメだとか」

    サンプルコードはチェックしていない気がします…
    例:2016年13月

    • *you より:

      `;:゙`;:゙;`(;゚;ж;゚; )ブフォッ!!!

      すみません…! なぜ自分で気づかなかったのか…! ご指摘ありがとうございます、追記いたしました(*`・ω・)ゞ

  2. イナカモノ より:

    お久しぶりです。イナカモノです。

    SQL文を見て少し気になりましたので…
    インデックスが入らないWHERE文になっております。
    件数が増えると速度が遅くなるやもしれません。
    下記を見て頂ければ分かると思います。

    ・hatena chips
    ttp://hatenachips.blog34.fc2.com/blog-entry-83.html

    ちなみにブログ作成はしましたが、私事がもうちょっとで落ち着きそうなので
    それからになると思います(;´Д`)

    それでは、また。

    • *you より:

      イナカモノさん、ご指摘ありがとうございます! インデックスのことをすっかり失念しておりました…! 本文修正いたしました。

      ブログ開設おめでとうございます! 楽しみにしてますーヽ(*´∀`)ノ


イナカモノ へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)

YouTubeでQ&Aコンテンツを企画しています

運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。