MS Access Tips/Sample and VBA and Blog customize etc...

レポートでカレンダー形式表示

今回はレポートで下記のようなカレンダーを表示します。

基になるテーブルは下記のようなテーブルです。
T_予定

日付   予定
2008/01/15  結婚記念日 
2008/12/05  ○○さんの誕生日 
2008/12/10  忘年会 
2008/12/15  町内会 
2008/12/25  クリスマスパーティー

予定のある日付だけしかレコードはありません。

というと、VBAやワークテーブルを使うと思うかも知れませんが、今回は、VBAもワークテーブルも使っていません。クエリとレポートの機能だけで実現しています。

クエリやレポートの機能の使い方のテクニックがいろいろありますのでぜひ御参考にしてください。

難易度:

その月のすべての日付を出力するクエリを作成する

T_予定 テーブルに予定のある日だけのデータしかありませんが、カレンダー表示にするにはその月のすべての日付データが必用になります。Accessではテーブルにないレコードを作り出すことはできませんので、下記のようなテーブルを用意しておきます。

T_Num

Num 
-5
-4
-2
 ・
 ・
 ・
36
37

これを利用して必用な日付のレコードを作成します。このテーブルより下記のようなクエリを作成します。

Q_カレンダー



このクエリを開くと[年][月]を聞いてきますので、希望の年と月を入力するとその年月の日付が表示されます。このクエリと T_予定 からクエリを作成して 日付 で外部結合したクエリをレコードソースとしてレポートを作成します。

レポートを作成する

レポートの詳細セクションには、左端にテキストボックスを2つ配置します。
一つのコントロールソースを
=IIf([Num]>0,Day([日付]),Null)
とします。これは 日 が表示されます。
もう一つはコントロールソースを
=IIf([Num]>0,[予定],Null)
とします。

メニューより [ファイル]-[ページ設定]-[レイアウト]で[列]を 7 と設定します。これで、カレンダーのように7列表示になります。下記は、A4横の用紙の場合の設定例です。


あとは、ページヘッダーに 年 と 月 を表示するテキストボックスと、曜日を表示するラベルを配置すれば完成です。具体的なレイアウトはサンプルをみて確認してください。

サンプルファイルが下記からダウンロードできます。
RptCalendar_07.zip (Access 2007-2010 形式 - 36kb)
RptCalendar.zip (Access 2002-2003 形式 - 32kb)
RptCalendar_2k.zip (Access 2000 形式 - 32kb)

サンプルでは、祝日を表示するために、下記サイトの祝日判定用関数を利用させていただいてます。
http://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm
また、条件付き書式で、日にちの文字色を、日曜祝日は赤、土曜は青にしています。

2010/12/14 追記: サンプルでは日曜日から始まってますが、月曜日から始めたい場合は、
Q_カレンダー クエリのWHERE句を下記の様に変更してください。

Weekday(・・・・,2) というようにWeekday関数の第2引数を追加するだけです。

他の曜日でも、始めたいのが火曜なら 3、水曜なら 4、・・・土曜なら 7、というように第2引数を設定すればOKです。

2016/08/06 追記:サンプルファイル内の祝日判定用関数を「山の日」対応の最新版に変更しました。また、前月の予定や祝日が表示されていたのを表示されないように変更しました。

拍手する

21 Comments

もみじ饅頭 says..."カレンダー表示のSQL"

初めまして、もみじ饅頭といいます。
Access Clubより飛んできました。
カレンダーの一か月分表示のSQLには感動しました。

それと同時に、質問事項が生じたので、書かせていただきます。

Q_カレンダーの5行目で
2-WeekDay(DateSerial([年][月],1))としているのはなぜでしょうか?
試しに、Day(DateSerial([年][月],1))としてみたら、同じ結果が出力されました。

WeekDayって曜日を数字で返す関数ですよね?
それから2を減算しているのも、何でだろう?っと言った疑問が生まれました。

もし、お時間ありましたら、回答のほうよろしくお願いします。

2009.07.23 14:05 | URL | #AqAJPbGU [edit]
hatena says..."カレンダの開始位置指定のためです"

例えば、今月 2009/07/01 は水曜日ですから、カレンダーだと4列目から始まりますよね。
2-WeekDay(DateSerial(2009,7,1)) は、-2 を返しますので、
T_Num の Num は、-2, -1, 0, 1 ・・・・・が抽出されて、Num = 1 のレコードはちょうど4番目にくるという仕掛けです。

2009.07.23 14:47 | URL | #5uE6dEgY [edit]
Sugarless says..."同じ日に複数の予定がある場合"

こんばんは、Sugarlessと申します。
いつも、このサイトで勉強させて頂いています。ありがとうございます。

今まさに、レポートでカレンダー形式で予定表を作成しようとしているんですが
同じ日に複数の予定を表示させることは可能でしょうか・・

いろいろ検索しましたが見当たらず
かといって自力で考えるスキルもなく・・orz

アドバイス頂けたら幸いですm(_ _)m

2010.03.30 19:04 | URL | #- [edit]
hatena says..."複数の予定"

Sugarlessさん、こんばんは。

テーブルはどのような構成でしょうか。
データ例を出してもらえますか。

例えば下記のような感じでしょうか。

予定ID 日付   予定
1     03/01 会議
2     03/01 打ち合わせ
3     03/03 出張

2010.03.30 21:51 | URL | #5uE6dEgY [edit]
Sugarless says..."同じ日に複数の予定がある場合2"

こんばんは。
せっかくお返事頂けたのに遅くなり申し訳ありませんm(_ _)m

テーブル構成なのですが以下のようになります。

■T_物件マスタ
物件ID(主キー)、物件名

■T_予定表
物件ID、年、月、日

■Q_予定表
T_物件マスタの物件IDとT_予定表の物件IDを結合
デザイングリッドには以下のフィールドを使っています。
物件名、日付: DateSerial([年],[月],[日])

Q_予定表を使ってレポートを作成したいと思っています。
同じ日付に複数の予定が出てくる可能性が高いので
複数表示できればいいなぁと思うのですが
何か構成を変更すれば可能でしょうか。

アドバイス頂ければ幸いです。
よろしくお願い致しますm(_ _)m

2010.04.04 20:32 | URL | #- [edit]
hatena says..."一日に複数予定"

このカレンダーに下記のページの方法を組み合わせれば可能です。

グループ内のデータを横連結する
http://hatenachips.blog34.fc2.com/blog-entry-12.html

日付 でグループ化して、グループフッターの非連結テキストボックスに物件名を追加していきます。
区切り文字は、上記のサンプルではカンマですが、改行(vbCrLf)に変更するなどすればいいでしょう。

2010.04.05 11:28 | URL | #5uE6dEgY [edit]
Sugarless says..."ありがとうございます"

お忙しいところアドバイスありがとうございます。

「グループ内のデータを横連結する 」をよく読んで
やってみたいと思います。

ありがとうございましたm(_ _)m

2010.04.06 20:34 | URL | #- [edit]
TOYOTA80 says..."一日に複数予定で予定をグループ化した表記にできませんか?"

こんにちは!TOYOTA80といいます。

レポートでカレンダー表示形式の複数予定表対応の中でtxt予定の項目内にテーブルのデータが2項目あるのですが、それをどうしたらグループ化し、表記できるのかがわからなかったのでおたずねします。

項目1 項目2
トヨタ  カローラ
トヨタ  パッソ
トヨタ  クラウン
ホンダ インサイト
ホンダ HRV
松田  MPV
    ↓下記のような表記にできないでしょうか?
(トヨタ)
カローラ
パッソ
クラウン
(ホンダ)
インサイト
HRV
(松田)
MPV

よろしくお願いします。

2010.05.25 12:38 | URL | #- [edit]
hatena says..."もう少し詳しい情報を"

TOYOTA80 さん

テーブルの他のフィールド名、データ例も提示ください。
テーブル名も教えてください。

なるべく実際に近い形で提示されると回答しやすいし、理解しやすいと思います。

2010.05.25 20:50 | URL | #5uE6dEgY [edit]
TOYOTA80 says...""

返答ありがとうございます。

今回カレンダー形式の車検リストを作成していてこのサイトにたどり着きました。もともとのテーブルは、このサイトのサンプルと同じようなテーブルにしています。

T_Num
Num(主キー)

T_予定
日付、ID、項目1、項目2(主キー設定なし)

としています。

レポートの詳細のところに項目1と項目2を縦に並べたらカレンダーの中に下記の状態で表記出来ました。

(トヨタ)
カローラ
(トヨタ)
パッソ
(トヨタ)
クラウン
(ホンダ)
インサイト
(ホンダ)
HRV
(松田)
MPV

そのレポート内でグループ(項目1)ごとに項目2の表記が出来ないかと思っています。

お忙しいかと思いますが宜しくお願いします。




2010.05.27 00:19 | URL | #- [edit]
hatena says..."グループ化して表示"

1日に複数レコードの予定があると言うことでしょうか。

下記の方法と組み合わせれば可能です。

グループ内のデータを横連結する
http://hatenachips.blog34.fc2.com/blog-entry-12.html

上記のサンプルをダウンロードして、支社別部署別社員一覧 というのを参考にしてください。
このサンプルの支社を今回の日付、部署を項目1に読み替えればいいでしょう。

簡単に説明しますと、
日付と項目1でグループ化して、日付グループフッター、項目1グループヘッダーを表示させます。
日付グループフッターに非連結のテキストボックスを配置します。
項目1グループヘッダー、詳細セクション、は非表示にして、フォーマット時イベントで非連結テキストボックスに項目1、項目2 を追加していきます。
また、上記の例ではカンマを区切りにしてますが、代わりに改行(vbCrLf)にすればいいでしょう。

2010.05.27 09:57 | URL | #5uE6dEgY [edit]
TOYOTA80 says..."ありがとうございます"

もうひとつよろしいでしょうか?

カレンダーで表示させたい月で前月分の予定も表示されるような状態ですのでNumで制御をかけないといけないのでしょうが旨く行きません!

よろしければご指導頂ければと思います。

2010.05.30 19:59 | URL | #- [edit]
TOYOTA80 says..."ありがとうございました。"

返事遅くなりました。
無事連結しての表記ができました。

お忙しい中ありがとうございました。

2010.06.14 18:37 | URL | #- [edit]
としき says..."週の始まり曜日を変更するには"

サンプルのご提供、ありがとうございます。
とても勉強になります。

加えて質問させていただきたいのですが、
週の開始曜日が現行では日曜日になっています。
それを土曜日から始まるものにするにはどのようにすればよいでしょうか。

T_Numに-6を加えたり38を加えたりしたのですが、
クエリの抽出式の理解が及ばないためうまく対応できません。

よろしければご回答お待ちしております。

2010.10.14 16:27 | URL | #j4ekpsMA [edit]
hatena says..."Re:週の始まり曜日を変更するには"

Q_カレンダー クエリのWHERE句を下記のように変更してください。

Num Between 2-Weekday(DateSerial([年],[月],1),7)
And Day(DateSerial([年],[月]+1,0));

赤字を追加しただけです。
月曜日から始めたいときは、7 を 1 とすればOKです。

2010.12.14 22:43 | URL | #5uE6dEgY [edit]
tetsuya says..."フォームでのカレンダー表示について"

はじめまして。現在accessの勉強に励み、本サイトを参考に勉強させて頂いています。

レポートでカレンダー表記ができるんだと感心していたところですが、フォームに同じように表示できるようにするにはどうしたらよろしいでしょうか?

ご教授宜しくお願いします。

2013.04.13 13:32 | URL | #cxq3sgh. [edit]
hatena says..."re:フォームでのカレンダー表示について"

フォームだとかなり難易度が上がります。

下記を参照したください。

カレンダー形式のスケジュール管理フォーム作成 その1 - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-186.html

2013.04.13 13:37 | URL | #5uE6dEgY [edit]
かず says..."サブクエリ化はできるのでしょうか"

はじめまして、実現したいことはあるのですが
素人レベルなので、方法がわからず検索して
ここに流れつきました。イメージ通りです。

おかげさまで、ここに書かれていることは
実現できるようになりました。

で、欲が出てきました。
チェックのため複数人の予定を1人づつ印刷したいの
ですが、思いつくままに氏名IDをくっつけて、
いくつかやってみましたが全く出来ません。

現状フォームで氏名IDを選択抽出してT_予定にデータを入れ
それをベースにレポート出力してます。

アドバイス等いただけましたらよろしくお願いします。

2014.10.18 20:51 | URL | #Fqjv6Bcs [edit]
ぷぅ~ says..."6週目の31日が表示できない"

カレンダー表示した際、31日が6週目にあたり5行しかないため表示されないので6行表示にするにはどの様に設定すればよろしいでしょうか。
それと、前月分の予定を非表示にするにはどの様にすればよろしいでしょうか。
よろしくお願いします。

2016.08.05 10:41 | URL | #9DD8ZWDM [edit]
hatena says..."re:6週目の31日が表示できない"

> カレンダー表示した際、31日が6週目にあたり5行しかないため表示されないので6行表示にするにはどの様に設定すればよろしいでしょうか。

上下余白を小さくする、詳細セクションの高さを小さくする、などで6行表示されるようにすればいいでしょう。

> それと、前月分の予定を非表示にするにはどの様にすればよろしいでしょうか。

予定 を表示するテキストボックスを下記のように設定します。

名前 txt 予定
コントロールソース =IIf([Num]>0,[予定],Null)

2016.08.06 02:41 | URL | #5uE6dEgY [edit]
ぷぅ~ says..."ありがとうございます。"

サンプルファイルを再度確認して出来ました。
お手数おかけしました。

2016.08.12 16:39 | URL | #- [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/56-e1e3e69a
該当の記事は見つかりませんでした。