日付の範囲を指定してデータを抽出【アクセス】

アクセスでデータを管理していると、日付の範囲を指定してデータを抽出したい!というケースは非常に多いと思います。

日付抽出の一例

  • 2020年1月1日~1月31日に来店した顧客を検索
  • 2020年1月~2020年4月の売上データを抽出
  • 最もカンタンは方法は、抽出用のクエリを作成。

    クエリの抽出条件に直接日付を入力する方法になりますが、今回はアクセスを使い慣れていない人でも抽出ができるように、専用のフォームを作成。

    フォームに配置した「登録日FROM」、「登録日TO」に入力された日付を元にデータを抽出するサンプルを作成してみました。
    [st-kaiwa1]

    フォームに入力した日付をもとに、ボタンひとつでデータの検索が可能です。

    一度仕組みを作ってしまえば、誰でもカンタンに希望のデータが取り出すことができますよ!

    [/st-kaiwa1]

    [st_af id=”917″]

    日付の範囲を指定してデータを抽出する手順

    今回作成したサンプルは、次のオブジェクトで構成されています。

    オブジェクト名 説明
    顧客TBL 顧客情報を格納しているテーブル
    F_データ抽出 抽出する日付を設定するフォーム
    F_顧客一覧1 登録年月日(YYYYMMDD)で抽出した結果を表示するフォーム
    F_顧客一覧2 登録年月(YYYYMM)で抽出した結果を表示するフォーム
    Q_顧客一覧1 F_顧客一覧1の作成元となるクエリ
    Q_顧客一覧2 F_顧客一覧2の作成元となるクエリ

    各種フォームの起動やエラー処理などの制御は全てVBAで記述しています。

    顧客TBLを作成する

    今回作成した顧客TBLのレイアウトと格納したデータは次の通りです。

    このテーブルに保持している「登録日」をキーとしてデータの抽出を行います。

    データ抽出用のフォームを作成する

    メニューの作成→空白のフォームをクリックして、新規フォームを作成。

    抽出条件となる「登録日(FROM)」と「登録日(TO)」のテキストボックスを配置します。

    今回のサンプルでは、年月日(YYYY/MM/DD)と年月(YYYY/MM)の2つのパターンで抽出可能としているため、全部で4つのテキストボックスを配置しています。

    日付を入力するテキストボックスは、フォーム起動時に本日の日付を表示させると親切ですね。

    これはVBAではなく、テキストボックスのプロパティシートの設定だけで実現できます。

    [st-mybox title=”年月日を初期表示” fontawesome=”fa-check-circle” color=”#000080″ bordercolor=”#FFD54F” bgcolor=”#FFFDE7″ borderwidth=”2″ borderradius=”5″ titleweight=”bold” fontsize=”” myclass=”st-mybox-class” margin=”25px 0 25px 0″]
  • 書式を「日付(標準)」に変更
  • 規定値に「=DATE()」を設定
  • [/st-mybox]
    [st-mybox title=”年月を初期表示” fontawesome=”fa-check-circle” color=”#000080″ bordercolor=”#FFD54F” bgcolor=”#FFFDE7″ borderwidth=”2″ borderradius=”5″ titleweight=”bold” fontsize=”” myclass=”st-mybox-class” margin=”25px 0 25px 0″]
  • 書式は空白
  • 規定値に「Format(Date(),”yyyy/mm”)」を設定
  • [/st-mybox]

    テキストボックスの設定が終わったら、抽出を実行する為のボタンを2つ設置。

    それぞれのボタンのクリックイベントに以下のVBAを記述します。

    [st-kaiwa2]

    完成したフォームはこちらです!

    [/st-kaiwa2]

    抽出結果を表示するフォームを作成する

    データ抽出用のフォームに入力された日付にてデータ抽出を行うためには、抽出対象となる「登録日」を含んだクエリを作成し、そのクエリを元にフォームを作成する必要があります。

    [st-step step_no=”1″]年月日抽出のクエリ(Q_顧客一覧1)を作成[/st-step]

    「登録日」の抽出条件に、以下を記述します。

    Between [Forms]![F_データ抽出]![登録日FROM1] And [Forms]![F_データ抽出]![登録日TO1] [st-step step_no=”2″]年月抽出のクエリ(Q_顧客一覧2)を作成[/st-step]

    「日付: Format([登録日],”yyyy/mm”)」の抽出条件に、以下を記述します。

    Between [Forms]![F_データ抽出]![登録日FROM2] And [Forms]![F_データ抽出]![登録日TO2]
    [st-minihukidashi fontawesome=”” fontsize=”80″ fontweight=”” bgcolor=”#3F51B5″ color=”#fff” margin=”0 0 0 -6px”]ココがポイント[/st-minihukidashi]
    [st-cmemo fontawesome=”fa-hand-o-right” iconcolor=”#3F51B5″ bgcolor=”#E8EAF6″ color=”#000000″ iconsize=”200″]クエリの抽出条件には、Between関数を使用。
    抽出条件にフォーム上に配置された日付のテキストボックスを指定しています。
    Q_顧客一覧2のクエリは「年月(YYYY/MM)」で抽出するため、「登録日(YYYY/MM/DD)」を「日付(YYYY/MM)」にフォーマット変換。
    この「日付」に対してBetween関数を使用します。 [/st-cmemo]

    2つのクエリを作成したら、作成→フォームウィザードより「Q_顧客一覧1」を選択。
    全ての項目を選択してフォームを作成します。

    同様に「Q_顧客一覧2」でもフォームを作成します。

    [st-kaiwa2]

    これで必要なオブジェクトの作成は終了です。

    [/st-kaiwa2]
    F_顧客一覧1
    F_顧客一覧2

    ツールの動作確認を実施する

    顧客テーブルにテスト用のデータを格納して、実際に日付範囲を指定して検索を実行してみて下さい。

    年月日、年月ともに対象範囲のデータが抽出され、検索結果のフォームに表示されればOKです。

    [st_af id=”917″]

    日付のチェックやエラーメッセージの表示を変更する

    最後の仕上げとして、日付項目の未入力チェックや、抽出対象のデータが存在しなかった時のエラー処理など、ツールを使いやすくする処理をVBAで追加しましょう。

    [st-step step_no=”1″]日付の未入力チェック[/st-step]

    日付が空白の時に検索を実行すると、エラーメッセージが表示されます。

    [st-cmemo fontawesome=”fa-lightbulb-o” iconcolor=”#FFA726″ bgcolor=”#FFF3E0″ color=”#000000″ iconsize=””]VBAのコード[/st-cmemo]
    Private Function 登録日check1()
     
    '=== 登録日FROM 未入力チェック ===
    
        If Nz(Me.登録日FROM1, "") = "" Then
        
             MsgBox "登録日FROMが未入力です。", vbExclamation, "未入力エラー"
             
             Me.登録日FROM1 = Date
             Me.登録日TO1 = Date
             
             登録日check1 = "日付チェックエラー"
    
             Exit Function
        End If
    
    '=== 登録日TO 未入力チェック ===
    
        If Nz(Me.登録日TO1, "") = "" Then
             MsgBox "登録日TOが未入力です。", vbExclamation, "未入力エラー"
             
             Me.登録日FROM1 = Date
             Me.登録日TO1 = Date
             
             登録日check1 = "日付チェックエラー"
    
             Exit Function
        End If
    
    End Function
    
    [st-step step_no=”2″]日付の範囲チェック[/st-step]

    「登録日TO」より「登録日FROM」が大きい時にエラーメッセージが表示されます。

    [st-cmemo fontawesome=”fa-lightbulb-o” iconcolor=”#FFA726″ bgcolor=”#FFF3E0″ color=”#000000″ iconsize=””]VBAのコード[/st-cmemo]
    '=== 日付の範囲チェック ===
    
        If Me.登録日FROM1 > Me.登録日TO1 Then
             
             MsgBox "日付の範囲指定が間違っています。" & vbCrLf & vbCrLf & "抽出条件を確認して下さい。", vbExclamation, "日付相関エラー"
             
             Me.登録日FROM1 = Date
             Me.登録日TO1 = Date
           
             Exit Sub
        End If
    [st-step step_no=”3″]日付の属性チェック[/st-step]

    日付形式以外の文字を入力した場合に、エラーメッセージが表示されます。

    [st-cmemo fontawesome=”fa-lightbulb-o” iconcolor=”#FFA726″ bgcolor=”#FFF3E0″ color=”#000000″ iconsize=””]VBAのコード[/st-cmemo]
    '=== 日付項目チェック(FROM) ===
    
        If IsDate(Me.登録日FROM2) = True Then
        Else
           MsgBox "登録日(FROM)は「YYYY/MM」の7桁で入力願います。", vbExclamation, "日付形式エラー"
    
           Me.登録日FROM2 = Format(Date, "yyyy/mm")
           Me.登録日TO2 = Format(Date, "yyyy/mm")
           
           登録日check2 = "日付チェックエラー"
           
           Exit Function
        End If
    
    [st-step step_no=”4″]抽出対象データなしのチェック[/st-step]

    指定日付のデータが存在しなかった場合にエラーメッセージを表示、検索結果画面に遷移させません。

    [st-cmemo fontawesome=”fa-lightbulb-o” iconcolor=”#FFA726″ bgcolor=”#FFF3E0″ color=”#000000″ iconsize=””]VBAのコード[/st-cmemo]
    Private Sub Form_Load()
    
        Dim Fcnt As Long
    
    '=== クエリで抽出されるレコード件数をカウントする ===
    
        Fcnt = DCount("登録日", "Q_顧客一覧2")
    
    '=== 対象データ無しの場合はフォームを閉じる ===
    
        If Fcnt = 0 Then
           MsgBox "対象データがありません。", vbInformation, "確認"
           DoCmd.Close acForm, "F_顧客一覧2", acSaveNo
        End If
    
    End Sub
    [st-kaiwa2]

    「IsDate関数」や「MID関数」、「LEN関数」「Dcount関数」などを駆使してこれらの処理を実装しています。

    [/st-kaiwa2]

    サンプルデータのダウンロード

    今回作成したサンプルデータは、無料でダウンロードできるようにしました!

    作成するのが面倒な人や、実際のVBAを知りたい人は、こちらからダウンロードしてみて下さい。

    [st_af id=”917″]

    この記事を書いた人

    ビジツールラボ