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

カレンダーダイアログ日付入力関数 祝日表示対応版

以前の記事 カレンダーダイアログ日付入力関数の改良版 でカレンダーコントロールを利用したダイアログを表示して日付を入力する関数を紹介しました。ただ、カレンダーコントロールを利用しているため、デザインを変えたり、祝日を表示したり、とかのカスタマイズはできませんでした。また、Access2010からはカレンダーコントロール自体が削除されました。

また、カレンダー形式のスケジュール管理フォーム作成 では、フォーム上にカレンダーを表示して日付を選択できるフォームを作成しました。

カレンダーコントロールの代わりのに、このオリジナルのカレンダーを利用すれば、カスタマイズ自由自在なカレンダーダイアログを作成することができます。Access2010以降でも使用できます。

VBACalendarDlg.png

難易度:

仕様

■ダイアログボックス形式

日付を入力したいテキストボックスの右隣にポップアップします。
【追加機能】デスクトップの右端近くの場合は、左隣にポップアップします。デスクトップの下端近くの場合は、ウィンドウが隠れない位置まで上方にずれます。

上部の左右に配置してあるコマンドボタンで月を移動します。日付をクリックすると日付を入力して閉じます。

タイトルバーのクローズボタン「×」をクリックすると入力せずに閉じます。

■ドロップダウン形式

日付を入力したいテキストボックスの下にドロップダウンリストのように表示します。
【追加機能】デスクトップの下端近くの場合は、上方に表示します。デスクトップの右端近くの場合は、ウィンドウが隠れない位置まで右方にずれます。

上部の左右に配置してあるコマンドボタンで月を移動します。日付をクリックすると日付を入力して閉じます。

カレンダーフォーム以外をクリックしてフォーカス移動すると入力せずに閉じます。

■キーボード操作

ダイアログボックス形式、ドロップダウン形式、共通です。

キー 操作
翌日を選択します。
前日を選択します。
先週の同じ曜日を選択します。
次週の同じ曜日を選択します。
PageUp 先月の同じ日にちに移動します。
PageDown 来月の同じ日にちに移動します。
Ctrl + PageUp 前年の同じ日にちに移動します。
Ctrl + PageDown 翌年の同じ日にちに移動します。
Home 当月の1日を選択します。
End 当月の月末を選択します。
Enter 選択した日付を入力して閉じます。
ESC 日付を入力せずに閉じます。

使用法

この記事の最後のサンプルMDBをダウンロードします。日付入力関数を利用したMDBで、サンプルMDBから、フォーム F_Calendar, F_CalendarDropDown、モジュール Calendar, Holiday をインポートします。

または、VBAウィンドウを開き、[ツール]-[参照設定] でサンプルMDBを参照します。(インポートか参照設定、どちらか一方だけでOKです。)

日付を入力したいテキストボックスの「ダブルクリック時」プロパティ欄に

=CallCalendar()
と設定します。

または、日付を入力したテキストボックスの隣にコマンドボタンを配置して、「クリック時」プロパティ欄に

=CallCalendar([txt日付])
と設定します。txt日付 はテキストボックス名です。

以上でカレンダーによる日付入力が可能になります。ドロップダウン形式で表示させたいときは、関数名を CallCalendarDropDown にします。

サンプル説明

フォーム1
単票フォームでのカレンダーダイアログの使用例
フォーム1DropDown
単票フォームでのカレンダードロップダウンの使用例
F_受注
帳票フォームでのカレンダーダイアログの使用例
F_受注DropDown
帳票フォームでのカレンダードロップダウンの使用例
フォーム2
メイン/サブフォームでのカレンダーダイアログの使用例
フォーム2DropDown
メイン/サブフォームでのカレンダードロップダウンの使用例

カスタマイズ

2010/12/09追記: カレンダーのサイズを変更したい場合は、下記の手順で可能です。

  1. F_Calendar または F_CalendarDropDown をデザインビューで開く。サイズを拡大したい場合はフォームの高さ、幅を十分広げておく。
  2. 標準モジュールの Calendarモジュールを開き、LabelSetSizeプロシージャをさがす。
  3. LabelSetSizeプロシージャ内の定数宣言(Const)の * 567 の前の数値をお好みのサイズに変更する。単位はセンチメートル(cm)です。
  4. イミディエイトウィンドウで、
    LabelSetSize "F_Calendar"
    または、
    LabelSetSize "F_CalendarDropDown"
    と記述してEnterキーを押す。
  5. F_Calendar または F_CalendarDropDown のデザインビューに戻りサイズが変更されているのを確認して、保存する。

「今日」、「前年」、「翌年」ボタンを追加したい場合は、F_Calendarフォーム上にコマンドボタンを配置して、それぞれの「クリック時」プロティ欄に、下記のように設定します。

=SetCalendar(Date())

=MoveMonth(-12)

=MoveMonth(12)

サンプルMDB が下記からダウンロードできます。
VBACalendarDlg_07.zip (Access 2007 形式 - 78kb)
VBACalendarDlg.zip (Access 2002-2003 形式 - 77kb)
VBACalendarDlg_2k.zip (Access 2000 形式 - 87kb)

利用法でご不明な点、また利用してみて不具合がありましたら、コメント欄かメールフォームからご連絡ください。また、ご要望も受け付けてます。

2010/12/09: Access 2002-2003 形式のサンプルを、AC2007上でのダブルクリックでカレンダードロップダウンの不具合を修正したものに差し替えました。また、AC2007形式のサンプルもアップしました。

拍手する

25 Comments

papakit says..."役立ちます"

ありがとうございます。
いつも、このサイトを楽しみながら?拝見しております。
以前から CallCalendar 関数を重宝して使用しています。
社内で祝祭日表示の要望がありどのようにしようか思案中でしたので、
そっくり使わせていただきました。
(少し、カスタマイズして会社休日も表示)
色々、有名なサイトがありますが汎用的な解説がほとんどで
即 実践活用のサイトは少ないものです。

これからの益々のご活躍を楽しみにしております。

2010.04.22 09:41 | URL | #- [edit]
hatena says..."ご声援、ありがとうございます。"

役にたったとのお言葉で、ブログ運営の苦労が報われます。

これからも、自分の興味のおもむくまま、気まぐれですが、情報発信していきますので、ご期待ください。

2010.04.22 13:05 | URL | #5uE6dEgY [edit]
黒ぽち says..."Access2000とAccess2010との互換性"

こんにちは。
AccessClubのサイトでGinⅡさんからこのHPを紹介していただきました。
実はAccess2000で作ったmdbにカレンダーコントロールがやたらに使ってありまして、2010では見ることも出来ませんでした。
hatenaさんのカレンダーを導入して本当に助かりました。
(表題はカレンダーby hatenaとしました)

欲を言えば、以前のように入力後フォーカスを次のテキストボックスに移していたことを出来ないだろうか~と模索中です。
テキストボックスの更新後のイベントで保存してから次へセットフォーカスでしょうかね。

2010.09.06 12:51 | URL | #tqOqU32A [edit]
矢ノ助 says..."ありがとうございます。"

たいへんたすかります。
2010でカレンダーコントロールがなくなることであっせっていました、DTPickerもクエリでパラメータで拾えないし、テキストに出すとフォーカスが動いてくれないし、あきらめて探していたところみつかりました。ありがとうございます。

2011.04.29 11:37 | URL | #8yNmqUjw [edit]
北のシロクマ says..."助かりそうです"

2002以降で使えるDBとして作っていまして、2010等で利用する場合にカレンダーをどうしようか?と悩んでいたので助かります!
ただ、Windows7(64)+Access2002の環境でテストしていますが、下記のようなエラーで苦しんでおります(Access初心者です^^;)

対象はテキストボックスで書式が「ggge\年m\月d\日」。
クリックで起動するようイベント指定したところ…
「実行時エラー '5': プロシージャの呼び出し、または引数が不正です。」
とエラー表示されました。
デバッグボタンクリックで対象と指示された行は「Form_F_Calendar」内「SetCalendar()」冒頭の「If DateDiff("m", vDate, aDate) = 0 Then」の行でした。

どうか、ワタクシメをお助けくださいませ。

2012.01.21 18:50 | URL | #- [edit]
hatena says..."re:助かりそうです"

当方では、Windows7(64)+Access2002の環境が用意できないので、
Win7(32)+Access2003 で、書式も「ggge\年m\月d\日」として実験してみましたが、症状を再現できませんでした。

このページのサンプルファイルでも症状がでますか。

Microsoft Office 製品に関する Windows 7 の対応状況
http://www.microsoft.com/japan/office/2007/OScompatibility.mspx

によると、

(注 2) 最新のサービスパックを適用した Office XP Service Pack 3 の環境がサポート対象となります。

とのことですが、Service Pack 3 は適用してますか。

Win7(64)以外の環境が用意できるのなら、それでも試してもらえますか。

2012.01.22 00:07 | URL | #5uE6dEgY [edit]
北のシロクマ says..."「実行時エラー '5'」のその後です。"

対応いただき、大変有り難う御座います。
また、お手数をおかけして、申し訳御座いません。

SPやUpdateは全て適用済みです。

テストできた環境は
 1.Windows7(64)+Access2002(XP)SP3
 2.Windows7(64)+Access2010(RunTime)
 3.WindowsXP SP3+Access2007(RunTime)
でして、ご用意頂いているサンプルファイルでも環境1においては同エラーが発生しました。
なお、環境2及び3ではエラーは無く、正常動作となりました。
Access2002環境は現在、エラーが発生している環境しかありませんでした。


Access初心者ですが、「if DateDiff("m", vDate, aDate) = 0 Then」は「同一月か?」ということだと判断しています。
ならば、「if Year(vDate) = Year(aDate) And Month(vDate) = Month(aDate) Then」でも良いかなとも思っていますが、いかがでしょうか?。

上記のような改造後、正常にカレンダーが表示されたので、テストを続行しましたら新たなエラーになりました。
前月と翌月の各ボタンにて

 イベント プロパティに指定した式 クリック時 でエラーが発生しました: プロシージャの呼び出し、または引数が不正です。
 * マクロ名、ユーザー定義関数名、[イベント プロシージャ] 以外の式が指定されています。
 * 関数、イベント、マクロの評価でエラーが発生しました。

のエラーが発生しました。
そこで、ボタンに「[イベント プロシージャ]」を指定し、起動されるFunctionにて改めて「MoveMonth」を呼び出すよう改造を追加しました。
しかしながら更に「MoveMonth」内の「SetCalendar DateAdd("m", n, vDate)」行にてエラーとなってしまいました。

どうも、DateDiff、DateAddにてエラーとなっているということかと…
これもなにかヒントになるかと、Google先生に尋ねてはみたのですが、未だ光が見えておりません。

お手数、おかけします。

2012.01.23 10:36 | URL | #- [edit]
hatena says..."re: 「実行時エラー '5'」のその後です。"

環境依存のエラーだとすると、エラーを再現できる環境が用意できないと、原因究明はなかなか難しいですね。

明日なら、出先の Win7(64)+AC2003 の環境でテストできるので、それまでお待ちいただけますか。

とりあえず、下記のようにエラー箇所の前にデバッグコードを埋め込んで、

  Debug.Print vDate, aDate 'デバッグコード
  If DateDiff("m", vDate, aDate) = 0 Then

エラーがでたときに、イミディエイトウィンドウに表示された結果をコピーして貼り付けてもらえますか。

2012.01.23 11:47 | URL | #5uE6dEgY [edit]
北のシロクマ says..."「実行時エラー '5'」のその後 その2"

お手数をおかけします。
恐縮しきりでございます。(ホントです)

ご指示のあったデバッグコードの件ですが、
 0:00:00 2008/01/10
と表示されました。

「MoveMonth」内の「SetCalendar DateAdd("m", n, vDate)」行にてのエラーですが、更に拙い知識で試行錯誤してみました。
単純に翌月(または前月)を算出した結果をコール先にパラメータ渡ししているだけと判断しました。
そこで、「vData」を年・月・日にばらし、年・月を算出した後に改めてパラメータ渡しする年月日を(cDateにて)整形してコールするようにしましたところ、何とか動作しております。
※説明下手で伝わっているか不安ですが…

2012.01.23 13:07 | URL | #- [edit]
hatena says..."re: 「実行時エラー '5'」のその後 その2"

> そこで、「vData」を年・月・日にばらし、年・月を算出した後に改めてパラメータ渡しする年月日を(cDateにて)整形してコールするようにしましたところ、何とか動作しております。

整形で動作するなら、

If DateDiff("m", vDate, aDate) = 0 Then

の部分を、


If DateDiff("m", Format(Date,"yyyy/mm/dd"), Format(aDate,"yyyy/mm/dd")) = 0 Then

と変更してみたらどうだろう。
ちょっと試してみてください。

2012.01.23 13:22 | URL | #5uE6dEgY [edit]
北のシロクマ says..."re:re: 「実行時エラー '5'」のその後 その2"

Formatを入れた場合も同様に実行時エラー5でした。

私の書き方が悪かったと思います。
「MoveMonth」で整形後に渡したのは「SetCalendar」であって、
 1.vDataから年・月・日をバラバラにする
 2.月にnを加算する
 3.年またぎの場合を考慮し翌年1月、前年12月などを再計算する
 4.計算結果を「年-月-日」としてcStrで文字列にする
 5.4をcDateで日付に戻す(これを仮に「tDate」とします)
 6.「SetCalendar tDate」としてカレンダーの再描画を呼び出す
という形でした。

2012.01.23 14:10 | URL | #- [edit]
hatena says..."re: 「実行時エラー '5'」のその後 その2"

前に、「出先の Win7(64)+AC2003 の環境でテストできるので、」とコメントしましたが、忙しくてテストできませんでした。
テストできるのは来週になります。

現状では、原因の想像がつきません。

ここを見ているどなたたかで、Win7(64)+AC2002 の環境が用意できる方で再現テストしてもらえる方は見えないでしょうか?

2012.01.26 15:04 | URL | #5uE6dEgY [edit]
hatena says..."re: 「実行時エラー '5'」テスト結果"

Win7(64)+AC2003 でテストしてみましたが、問題なく動作しました。書式も、ggge\年m\月d\日 としましたが問題なしです。

AC2002特有の問題なのか、そちらのファイルに問題があるのか、、、
どちらにしてもまったく同じ環境、ファイルを用意できないので、これ以上の原因究明は難しいですね。

2012.02.01 11:25 | URL | #5uE6dEgY [edit]
矢ノ助 says..."ちらつき"

hatenaさんいつもお世話になります。
会社は2010移行でご提供頂いたカレンダーで非常に助かっております。
ただ、カレンダー起動時にほんの少しチラつくのですが回避できますでしょうか
起動時の位置の問題でしょうか
Forms!フォーム.Painting = False
をしているのですが、どうしても瞬間チラつきます
気になっているのは自分だけかもしれませんが
対策があればご教授願います。

2012.07.16 02:01 | URL | #- [edit]
hatena says..."re: ちらつき"

当方では、気にならないのですが、
「ちらつき」とは具体的にはどのようなものでしょうか。

フォームにはどのようなコントロールが配置してありますか。

仕様上、別フォームをポップアップで開いてますので、Accessのタイトルバーの背景色がアクティブから非アクティプに変わりますがそれとは違いますか。

2012.07.16 03:05 | URL | #5uE6dEgY [edit]
しい says..."いつもいつも"

困った時ばかりhatenaさんの記事を拝見しております。
参考になる記事ばかりでとても役立っています。

早速ですが、一つ質問させて下さい。
環境 windows7 32 および 64  access 2007 および 2010

フォームイベントのダーティーでフラグを立てるプロジャーを組んだのですが、
このカレンダーをそっくり使わせて頂いたところイベントが立ちません。
何か対策があればご教授願います。

2013.03.05 11:17 | URL | #SFo5/nok [edit]
hatena says..."re:いつもいつも"

VBAで値を代入した場合は更新系のイベントは発生しません。
下記を参考に、CallCalendar 関数を書き換えるか、

http://hatenachips.blog34.fc2.com/blog-entry-57.html
値の代入で更新イベントを発生させる

あるいは、イベントプロシージャからCallCalendarを呼び出して、
そこで、Dirtyプロパティを変更してもいいでしょう。

コード例

Private Sub テキスト1_DblClick(Cancel As Integer)

  CallCalendar
  Me.Dirty = True

End Sub

これでダーティー時イベントが発生します。

2013.03.12 15:57 | URL | #5uE6dEgY [edit]
矢ノ助 says..."カレンダー使用時"

hatena様
昨年投稿したまま返事もせず申し訳ございません。
失念しており大変失礼をいたしました。
ちらつきですが、コマンドボタンのクリックイベト
=CallCalendar([日付1])
でテキスト「日付1」「日付2」に描きだしています。
カレンダーのフォームが開くとき違う場所で一瞬ですがフォームが開き、ボタンの下に表示されます。カレンダーフォームを保存した場所なのかもしれませんが
別の質問になりますが日付が入力されるフォームのプロパティの追加、更新を「いいえ」として、カレンダーの日付をクリックすると日付データを書き込むと同時に他のフィールドの追加、更新が出来てしまうのですが、どうやって解除されているのでしょうか

2013.07.23 18:28 | URL | #8yNmqUjw [edit]
hatena says..."カレンダーのちらつき"

> カレンダーのフォームが開くとき違う場所で一瞬ですがフォームが開き、ボタンの下に表示されます。カレンダーフォームを保存した場所なのかもしれませんが

当方の環境では気にならないので(PCのグラフィック性能の関係かも)、効果があるか確認できませんが、下記を試してみてください。

F_Calendarの開くときのモジュールの中に

Me.SetFocus
DoCmd.MoveSize 0, 0 'X, Y

というコードがありますが、これを、Form_Openプロシージャの一番最後(End Sub の前)に移動してみてください。
これで改善できない場合は、上記の2行の前に、

Me.Move -100000, -100000

を挿入してみてください。


> カレンダーの日付をクリックすると日付データを書き込むと同時に他のフィールドの追加、更新が出来てしまうのですが、どうやって解除されているのでしょうか

特に何もしてもません。テキストボックスに日付を代入しているだけです。
VBAで更新すると、「追加の許可」「更新の許可」が「はい」になるようです。

「更新の許可」が「いいえ」のときはCallCalendarを呼ばないようにすればどうでしょう。

=IIf([AllowEdits],CallCalendar())

2013.07.24 12:56 | URL | #5uE6dEgY [edit]
矢ノ助 says..."カレンダーのちらつき"

hatena様
ご連絡ありがとうございます。
ちらつきですが教えて頂いた2通りを実行しましたがやはり一瞬ちらつきが出ます。サーバーからローカルにしても本サイトのサンプルを再度ダウンロードしても一瞬ちらついてしまいます。
PCはLENOVO X220 OSはWIN7 ACCESS2010です。違うPC、DELLデスクトップの同じ環境でもちらついてしまいます。でもでもちゃんと動いてますからあきらめた方がいいようにも思います。
更新についてはうまくできました。ありがとうございます。
IIf関数についてご教授下さい更新がFalseのとき、実行しないということはfalse処理カンマ以降は省略ということでしょうか
=IIf([AllowEdits],CallCalendar())

2013.07.24 17:36 | URL | #8yNmqUjw [edit]
hatena says...""

> PCはLENOVO X220 OSはWIN7 ACCESS2010です。違うPC、DELLデスクトップの同じ環境でもちらついてしまいます。

そうですか。ちなみに、F_受注DropDown の方でも同じですか。

> IIf関数についてご教授下さい更新がFalseのとき、実行しないということはfalse処理カンマ以降は省略ということでしょうか

はい、省略しています。省略せずに

=IIf([AllowEdits],CallCalendar(),Null)

としても

=IIf([AllowEdits],CallCalendar(),0)


としても OK です。式の返す値は無視しますので。

CallCalendar() 関数が評価されるかどうかだけ、です。

2013.07.24 17:54 | URL | #5uE6dEgY [edit]
矢ノ助 says..."カレンダーのちらつき"

hatena様
ご連絡ありがとうございます。
F_受注DropDown の方はちらついていません
全部見てみました。

2013.07.24 18:07 | URL | #- [edit]
まだまだ初心者 says...""

お世話になります。

職場で、Access2010で期間を指定して、フリーワード検索するフォームを作成した際に、利用させていただきました。
VBAをあまり知らなくても、設定できました。
ありがとうございます。

ところが、職場のパソコンが Office2013 64bitになった際に、このカレンダーが開かなくなり、
原因は「axvlc.dllが見つからない」ということでした。
このdllファイルは、VLCメディアプレイヤーのもののようなので、これをインストールしたら解決しました。

「axvlc.dllが見つからない」となる原因は不明で、64bitのOfficeが関係しているかも不明ですが、
VLCメディアプレイヤーは職場でも好評なので、結果オーライでした。

2014.12.19 11:26 | URL | #- [edit]
中野 豊 says..."解決できました"

RECT宣言のコンパイルエラーで質問しました。
Accessの画面を起動したときの大きさの調整をするため、すでにRECTの宣言をしていた所と重複によるエラーでした。調べ方を少し変えればよかったのですが、難しいところを中心に見てました。
お騒がせして申し訳ありません。
カレンダー助かります。
ありがとうございました。

2016.03.15 12:17 | URL | #L99P1.cs [edit]
木澤 says..."開いたときに今日の日付に"

こんにちは。VBA初心者です。
いろいろな情報を集めながら仕事で必要なDBを作っており、このようなサイトを見つけて非常に助かっております。ありがとうございます。

カレンダーを開いたときにすでに入力されている日付ではなく常に今日の日付を表示したいのですがどのようにすればいいのでしょうか。
お時間あるときに教えていただけますとありがたいです。

2016.04.11 10:33 | URL | #- [edit]

Leave a reply






Trackbacks

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