日常~おまけ雑記~

日常にほんの少し活力を~毎日の出来事やオーディオなど趣味のことを紹介するブログです



accessで日付範囲のカレンダーテーブルを作成するVBA|カレンダー作成

アクセスでカレンダーのような一覧表をフォームに作成する場合などで、カレンダーテーブルを作成する一つの手法として下記VBAご参考にどうぞ。

※日付テーブルを一度だけ作成出来れば良いなら、エクセルの日付データをインポートする手もあります。

ただし、あまり何年ものデータ作成するのが面倒だったり、作成した期間以上にシステムを使い続ける事になると結局面倒です。

それならば、アクセス内部で自動的に日付を追加していけるようにしてみてはどうでしょう。

f:id:takalogpoint:20190930143848j:plain

※ここで使用するACCESS画像のバージョンは2013です

 

■テーブルの内容

【T_カレンダ】・・・テーブル名

【連番】・・・数値型(LONG)

【日付】・・・日付時刻型(日付S)

【曜日】・・・短いテキスト(サイズ1)

 

今回は「日付」以外に連番と曜日を足しました。

連番は特に意味は無く、データの数がわかるくらいでしょうか。

曜日は「月」や「火」など1文字だけ取得するのでサイズを1としてあります。

もちろん1以上の数値のままでもかまいません。

f:id:takalogpoint:20190930143810j:plain

■フォームの内容

【F_カレンダ作成】・・・フォーム名

①【納期】・・・テキストボックス、書式yyyy/mm/dd

②【納期前】・・・テキストボックス

③【納期後】・・・テキストボックス

④【cmd1】・・・カレンダー作成ボタン

 

フォームには①から④のオブジェクトをセットします。

②③のデータ式には下記を記入します。

②・・・=Format(DateAdd("d",-7,[納期]),"yyyy/mm/dd")

③・・・=Format(DateAdd("d",7,[納期]),"yyyy/mm/dd")

ここでは例として①の日付を入力したとき、②には7日前の日付、③には7日後の日付が算出されます。

この②から③の日付範囲データをテーブルに格納します。

f:id:takalogpoint:20190930144152j:plain

■日付を入力したときの動作

テキストボックスの書式を日付型にするとカレンダーコントロールで入力出来ます。

日付入力後、確定すると②【納期前】と③【納期後】に自動的に日付が入力されます。

f:id:takalogpoint:20190930144242j:plain

 

f:id:takalogpoint:20190930144311j:plain

■標準モジュールにVBAをセットする

標準モジュールに下記コードを記述します。

モジュールの名前は【カレンダ作成モジュール】としています。

必要なデータを変数に代入してから、SQLで追加クエリを実行し、1行ずつテーブルに格納しています。

f:id:takalogpoint:20190930144411j:plain

 

■以下モジュール内コード

Public Sub calender()

'--------------------------------------------

'テーブル内容を消しておく

DoCmd.RunSQL "delete from T_カレンダ"

'--------------------------------------------

'--------------------------------------------

'変数セット

Dim dy As Date '処理日

Dim kb As Date  '範囲開始日

Dim ka As Date  '範囲終了日

Dim no As Long  '連番

Dim wk As String    '曜日

Dim str As String 'クエリの文字列

'--------------------------------------------

'--------------------------------------------

'固定値の代入

no = 1  '連番の開始値

kb = [Forms]![F_カレンダ作成]![納期前]    '基準日から何日前before

ka = [Forms]![F_カレンダ作成]![納期後]    '基準日から何日後after

'--------------------------------------------

'--------------------------------------------

'1行ずつ追加クエリでテーブルに格納する

For dy = kb To ka

wk = Format$(dy, "aaa")

str = "insert into T_カレンダ "

str = str & "(連番,日付,曜日) "

str = str & "values (" & no & ","

str = str & "'" & dy & "'" & ","

str = str & "'" & wk & "'" & ")"

DoCmd.RunSQL str

no = no + 1

Next dy

'--------------------------------------------

'--------------------------------------------

'終了メッセージ

MsgBox "処理が終わりました"

'--------------------------------------------

End Sub

 

■フォームのボタンを設定する

カレンダ作成ボタン【cmd1】のプロパティで、クリック時-コードビルダーを作ります。

クリック時のVBAはモジュールに書いたプロシージャーを呼び出すだけです。

※Call calender

ちなみに「Call」は省略出来ますが、コードを読みやすくするためいつも書いています。

f:id:takalogpoint:20190930144533j:plain

■動作確認してみましょう

カレンダ作成ボタンをクリックすると、クエリが動き、終わったらメッセージがでます。テーブルを開いてデータを確認してみてください。

f:id:takalogpoint:20190930144602j:plain

 

f:id:takalogpoint:20190930144632j:plain

 

■最後に

今回は、ある日付から範囲を割り出し作成しました。別に、日付を開始日と終了日の2カ所入力して作成しても良し。日付を更新後に自動的に作成させれば、作成ボタンも不要になります。出来るようなら作成中のシステムに組み込みやすいようにしてご活用ください。

 

 

 



www.omake-zakki.com

www.omake-zakki.com

www.omake-zakki.com

www.omake-zakki.com

www.omake-zakki.com