#666 日付の期間を一度に入力するサンプルプロシージャ フォーム、VBA

フォームに配置した2つのテキストボックスの日付の期間(自〜至)を参照して、パラメータクエリのWhere条件としたり、フォームのフィルタ条件としたり、あるいはレポートを開く際のWhere条件としたりといったことがあります。


そのようなインタフェースでしばしば入力する一定期間のパターンがある場合、それをボタンのワンクリックで入力できるようにすると操作が楽になります。たとえば、現在日付からみて「今月(1日〜末日)」の2つを入力する、「今年(1月1日〜12月31日)」の2つを入力するといったような場合です。

そのようなときに使える、2つの日付入力用のテキストボックスに所定の期間を一度に入力するための汎用的なサンプルプロシージャ例を紹介します。

なお、このプロシージャの呼び出しは各ボタンのクリック時イベントプロシージャから行うこともできますが、ボタンを簡単に他のフォームにも流用できるよう、ここでは”Function”プロシージャとして作成することでフォームのデザインビューのプロパティシートでその設定をできるようにします。


そのプロシージャ例は次のようなものです。そのフォームのモジュールに記述してもよいですが、いろいろなフォームで使えるものですので、”標準モジュール”に記述しておくとよいと思います。

Public Function SetDateTerm(Interval As String, Number As Long, _
                        txtStart As TextBox, txtEnd As TextBox)
'日付の期間を2つのテキストボックスに代入するプロシージャ

  Dim lngWeekNum As Long
  Dim intCurNendo As Integer

  Select Case Interval
    Case "d"        '日
      'Number日分加減算した日付を自至両方に代入
      txtStart = DateAdd("d", Number, Date)
      txtEnd = DateAdd("d", Number, Date)

    Case "ww"       '週
      '今日の曜日を取得して
      lngWeekNum = Weekday(Date)
      'Number週分加減算した週の日曜を自に代入
      txtStart = DateAdd("d", 1 - lngWeekNum + 7 * Number, Date)
      'Number週分加減算した週の土曜を至に代入
      txtEnd = DateAdd("d", 7 - lngWeekNum + 7 * Number, Date)

    Case "m"        '月
      'Number月分加減算した月の1日を自に代入
      txtStart = DateSerial(Year(Date), Month(Date) + Number, 1)
      'Number月分加減算した月の月末日を至に代入
      txtEnd = DateSerial(Year(Date), Month(Date) + 1 + Number, 0)

    Case "yyyy"     '年
      'Number年分加減算した年の1月1日を自に代入
      txtStart = DateSerial(Year(Date) + Number, 1, 1)
      'Number年分加減算した年の12月31日を至に代入
      txtEnd = DateSerial(Year(Date) + Number, 12, 31)

    Case "ynd"      '年度
      '今日の年度を取得してNumber年分加減算
      intCurNendo = IIf(Month(Date) >= 4, Year(Date), Year(Date) - 1) + Number
      'その年の4月1日を自に代入
      txtStart = DateSerial(intCurNendo, 4, 1)
      'その翌年の3月31日を至に代入
      txtEnd = DateSerial(intCurNendo + 1, 3, 31)

  End Select

End Function


このプロシージャの引数は下記の4つです。
  1. Interval
    現在日付に対して加減算する”単位”を文字列(前後を”で囲む)で指定します。このサンプルプロシージャでは次のいずれかを指定します。たとえば「翌月」の期間を入力させたいのあれば「"m"」を指定します。「前年」の期間を入力させたいのあれば「"yyyy"」を指定します。
    • "d"  →  日
    • "ww"  →  週
    • "m"  →  月
    • "yyyy"  →  年
    • "ynd"  →  年度

    ※ここで、「"mm"」は”現在日付から見た1ケ月前や後”ではなく、”前月や翌月の1日〜末日”としています。これは週や年なども同様です。たとえば今日が2018/09/15の場合、”今月”は9/15〜10/14ではなく「2018/09/01〜2018/09/30」となります。同様に”今年"は「2018/01/01〜2018/12/31」となります。締日などを考慮したところの”今月度”などとは違います。
    ※上記の引数の指定方法はVBAの標準関数である「DateAdd関数」のものをまねています("ynd"以外)。

  2. Number
    現在日付に対して加減算する”値”を指定します。たとえば、「現在月なら0」、「前月なら-1」、「翌月なら+1」といったように指定します。

  3. txtStart
    1と2の引数によって計算された日付期間の「自」の方を入力するテキストボックスコントロールを指定します。

  4. txtEnd
    1と2の引数によって計算された日付期間の「至」の方を入力するテキストボックスコントロールを指定します。

※このプロシージャは”Function"ではありますが、返り値はありません。”Sub”ではプロパティシートで指定できないので”Function"にしているだけです。ただし3と4に指定されたテキストボックスに値が代入されますので、それがいわば返り値のような役割となります。


上記のプロシージャは、下記のようにフォームのデザインビューからプロパティシート上で設定して呼び出します。



上図のサンプルでは15ケのコマンドボタンが配置されていますが、それぞれ下表のようにプロパティを設定します。第3引数と第4引数はすべて同じですが、第1引数・第2引数を見渡して比べてみると引数指定の要領が分かると思います。
加減算の単位 ボタンの標題 クリック時プロパティの値
昨日 =SetDateTerm("d",-1,[期間自],[期間至])
今日 =SetDateTerm("d",0,[期間自],[期間至])
明日 =SetDateTerm("d",1,[期間自],[期間至])
先週 =SetDateTerm("ww",-1,[期間自],[期間至])
今週 =SetDateTerm("ww",0,[期間自],[期間至])
来週 =SetDateTerm("ww",1,[期間自],[期間至])
先月 =SetDateTerm("m",-1,[期間自],[期間至])
今月 =SetDateTerm("m",0,[期間自],[期間至])
来月 =SetDateTerm("m",1,[期間自],[期間至])
昨年 =SetDateTerm("yyyy",-1,[期間自],[期間至])
今年 =SetDateTerm("yyyy",0,[期間自],[期間至])
来年 =SetDateTerm("yyyy",1,[期間自],[期間至])
年度 昨年度 =SetDateTerm("ynd",-1,[期間自],[期間至])
今年度 =SetDateTerm("ynd",0,[期間自],[期間至])
来年度 =SetDateTerm("ynd",1,[期間自],[期間至])


実行例:
  • [今日]をクリックしたとき
  • [先週]をクリックしたとき
  • [来月]をクリックしたとき
  • [今年]をクリックしたとき
  • [今年度]をクリックしたとき
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved